机器学习入门级实例——针对葡萄酒质量进行建模
數(shù)據(jù)背景
本文數(shù)據(jù)取至于UCI——歐文大學機器學習數(shù)據(jù)庫,是一個免費且十分好用的數(shù)據(jù)庫,在學習機器學習時會接觸一個基礎的數(shù)據(jù)集——鳶尾花,就是歐文大學提供的,本文就是在一個名叫葡萄酒品質的數(shù)據(jù)集的基礎上進行建模
附上數(shù)據(jù)鏈接:數(shù)據(jù)集
該數(shù)據(jù)集一個優(yōu)點就是可以適用于分類和回歸兩種算法進行不同的建模,但是目的都為了預測葡萄酒的品質
本文利用KNN、決策樹、隨機森林對數(shù)據(jù)進行建模
數(shù)據(jù)處理
庫與工具
import pandas as pd #方差選擇 from sklearn.feature_selection import VarianceThreshold #皮爾遜相關系數(shù) from scipy.stats import pearsonr #標準化 from sklearn.preprocessing import StandardScaler #數(shù)據(jù)劃分 from sklearn.model_selection import train_test_split #決策樹 from sklearn.tree import DecisionTreeClassifier,export_graphviz #KNN from sklearn.neighbors import KNeighborsClassifier #網格搜索和交叉驗證 from sklearn.model_selection import GridSearchCV #隨機森林 from sklearn.ensemble import RandomForestClassifier工具:jupyter notebook
導入數(shù)據(jù)
在利用read_csv讀取該文件時,需要注意sep參數(shù)的設置應該為‘;’
該數(shù)據(jù)集一共有11個特征值和一個目標值
分為別:
1-固定酸度 2-揮發(fā)性酸度 3-檸檬酸 4-殘留糖 5-氯化物 6-游離二氧化硫
7-總二氧化硫 8-密度 9-pH 10-硫酸鹽 11-醇 12-質量
特征值不算很多,所以在數(shù)據(jù)處理的過程中就沒有必要進行特征降維
并且該數(shù)據(jù)集沒有缺失值,省去了缺失值處理
特征工程
數(shù)據(jù)和特征決定了機器學習的上限,而模型和算法只是逼近這個上限而已,而特征工程就是最大程度從原始數(shù)據(jù)中提取主要特征供建模使用
#檢查是否方差有為0的情況 transfer = VarianceThreshold() new_data = transfer.fit_transform(data1) print('new_data:\n',new_data,new_data.shape)在特征值比較多的大數(shù)據(jù)集中,可能會存在兩個特征之間的方差為0或者方差特別小的情況,也就是這兩個特征對于目標值的影響相同或相似,即特征冗余情況,就需要對特征進行選擇
在這11個特征中沒有方差為0的情況,VarianceThreshold()中也可以設置一個閾值,刪去方差小于該閾值的特征,但是這個數(shù)據(jù)集比較小,不太適合這種方法
這里選擇用皮爾遜相關系數(shù)進行特征選擇
可以算出兩兩特征之間的相關系數(shù),如下圖:
相關系數(shù)大致可以理解成三種情況:
當相關系數(shù)為0時,X和Y兩變量無關系。
當X的值增大(減小),Y值增大(減小),兩個變量為正相關,相關系數(shù)在[0,1]之間。
當X的值增大(減小),Y值減小(增大),兩個變量為負相關,相關系數(shù)在[-1,0]之間。
通俗講就是相關系數(shù)越接近于1或-1,兩變量相關性越強
索引出相關系數(shù)大于0.6,即相關性比較強的特征
| 0.6155009650098364 | 40 |
即上圖兩個紅框里的特征:殘留糖和密度、游離二氧化硫和總二氧化硫
殘留糖和密度的相關性達到了0.83,已經是強相關,所以這里選擇刪去密度這一特征
在游離二氧化硫和總二氧化硫之間可以嘗試進行特征選擇
從數(shù)據(jù)簡介中了解到葡萄酒的質量等級分為0-10,分布太廣,并且過于細致,為了建模后利于分類,所以將質量分為三個等級:劣質(inferior)、普通(ordinary)、優(yōu)質(superior)
利用算法建模
在進行建模之間需要對數(shù)據(jù)集進行劃分,即將數(shù)據(jù)集分為訓練集和目標集
#劃分數(shù)據(jù)集 x_train,x_test,y_train,y_test = train_test_split(data2,data3,test_size =0.2,random_state = 6)data2為所有的特征,data3為目標值,test_size控制劃分程度,即數(shù)據(jù)中**80%**為訓練集,**20%**為測試集
因為有三種方法進行建模,所以控制隨機種子相同,便于觀察對于該數(shù)據(jù)集哪一種算法的準確率更高一些
KNN(K最鄰近)
所謂K最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。kNN算法的核心思想是如果一個樣本在特征空間中的k個最相鄰的樣本中的大多數(shù)屬于某一個類別,則該樣本也屬于這個類別,并具有這個類別上樣本的特性。
#標準化 transfer = StandardScaler() x_train = transfer.fit_transform(x_train) x_test = transfer.transform(x_test) #KNN預估器 estimator1 = KNeighborsClassifier() #網格搜索和交叉驗證 param_dict = {'n_neighbors':[i for i in range(1,16)]} estimator1 = GridSearchCV(estimator1,param_grid=param_dict,cv = 10) estimator1.fit(x_train,y_train) #模型評估 #1)比對真實值與預測值 y_predict1 = estimator1.predict(x_test) print('布爾比對:\n',y_predict1==y_test) #2)查看準確率 score1 = estimator1.score(x_test,y_test) print('模型準確率:\n',score1) #得出最優(yōu)模型 print('最佳結果:\n',estimator1.best_estimator_)在許多方法的預估器中有超參數(shù),即需要訓練者人工輸入并作出調整的變量,網格搜索就是選擇訓練者設置的可選參數(shù)值并預估出最優(yōu)的結果,是算法調優(yōu)的一種常用方法
KNN建模結果如下圖:
決策樹
決策樹是一種典型的分類方法,首先對數(shù)據(jù)進行處理,利用歸納算法生成可讀的規(guī)則和決策樹,然后使用決策對新數(shù)據(jù)進行分析。本質上決策樹是通過一系列規(guī)則對數(shù)據(jù)進行分類的過程。
#決策樹預估器 estimator = DecisionTreeClassifier(criterion='entropy')#信息熵 estimator.fit(x_train,y_train) #模型評估 y_predict = estimator.predict(x_test) #1)比對真實值與預測值 print('布爾比對:\n',y_predict==y_test) #2)查看準確率 score = estimator.score(x_test,y_test) print('模型準確率:\n',score)export_graphviz(estimator,out_file = 'wine.dot',feature_names=data_title2)決策樹的劃分依據(jù)之一是信息增益,也算是決策樹的一種調優(yōu),可以自行了解
決策樹建模結果如下圖:
隨機森林
隨機森林是一個包含多個決策樹的分類器, 并且其輸出的類別是由個別樹輸出的類別的眾數(shù)而定
#隨機森林評估器 estimator2 = RandomForestClassifier() #網格搜索和交叉驗證 param_dict = {'n_estimators':[i for i in range(1,100,5)],'max_depth':[i for i in range(10,30,5)]} estimator2 = GridSearchCV(estimator2,param_grid=param_dict,cv = 3) estimator2.fit(x_train,y_train) #模型評估 y_predict2 = estimator.predict(x_test) #1)比對真實值與預測值 print('布爾比對:\n',y_predict2==y_test) #1)比對真實值與預測值 #2)查看準確率 score = estimator2.score(x_test,y_test) print('模型準確率:\n',score) #得出最優(yōu)模型 print('最佳結果:\n',estimator2.best_estimator_)隨機森林超參數(shù)較多,所以運行時間比較長,也可以利用網格搜索設置不同的參數(shù)值進行調優(yōu)
隨機森林建模結果如下圖:
總結
KNN模型準確率:0.9316326530612244
決策樹模型準確率:0.9122448979591836
隨機森林準確率:0.9510204081632653
三個模型的準確率都還可以,其中隨機森林的準確率達到了95%,比較客觀
如果想要提高模型的準確率:異常值處理、更佳細致的特征工程、超參數(shù)的調節(jié)
沒有免費的午餐:
雖然隨機森林的準確率比較高,但是不能說隨機森林算法就優(yōu)于其他算法甚至代替其他算法,每一種算法都有適合自己的數(shù)據(jù),每一種算法的應用場景也是不同的
總結
以上是生活随笔為你收集整理的机器学习入门级实例——针对葡萄酒质量进行建模的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fenix3 hr 中文说明书_Feni
- 下一篇: 文章/网站分享工具——百度分享