日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

机器学习入门级实例——针对葡萄酒质量进行建模

發布時間:2023/12/20 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习入门级实例——针对葡萄酒质量进行建模 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

數據背景

本文數據取至于UCI——歐文大學機器學習數據庫,是一個免費且十分好用的數據庫,在學習機器學習時會接觸一個基礎的數據集——鳶尾花,就是歐文大學提供的,本文就是在一個名叫葡萄酒品質的數據集的基礎上進行建模
附上數據鏈接:數據集
該數據集一個優點就是可以適用于分類和回歸兩種算法進行不同的建模,但是目的都為了預測葡萄酒的品質
本文利用KNN、決策樹、隨機森林對數據進行建模

數據處理

庫與工具

import pandas as pd #方差選擇 from sklearn.feature_selection import VarianceThreshold #皮爾遜相關系數 from scipy.stats import pearsonr #標準化 from sklearn.preprocessing import StandardScaler #數據劃分 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

導入數據

在利用read_csv讀取該文件時,需要注意sep參數的設置應該為‘;’
該數據集一共有11個特征值和一個目標值
分為別:
1-固定酸度 2-揮發性酸度 3-檸檬酸 4-殘留糖 5-氯化物 6-游離二氧化硫
7-總二氧化硫 8-密度 9-pH 10-硫酸鹽 11-醇 12-質量
特征值不算很多,所以在數據處理的過程中就沒有必要進行特征降維
并且該數據集沒有缺失值,省去了缺失值處理

特征工程

數據和特征決定了機器學習的上限,而模型和算法只是逼近這個上限而已,而特征工程就是最大程度從原始數據中提取主要特征供建模使用

#檢查是否方差有為0的情況 transfer = VarianceThreshold() new_data = transfer.fit_transform(data1) print('new_data:\n',new_data,new_data.shape)

在特征值比較多的大數據集中,可能會存在兩個特征之間的方差為0或者方差特別小的情況,也就是這兩個特征對于目標值的影響相同或相似,即特征冗余情況,就需要對特征進行選擇

在這11個特征中沒有方差為0的情況,VarianceThreshold()中也可以設置一個閾值,刪去方差小于該閾值的特征,但是這個數據集比較小,不太適合這種方法
這里選擇用皮爾遜相關系數進行特征選擇

#特征名字索引 data_title = data1.columns.values.tolist() r = [] for i in range(len(data_title)):for j in range(i+1,len(data_title)):print('%s和%s之間的皮爾遜相關系數為%f'%(data_title[i],data_title[j],pearsonr(data1[data_title[i]],data1[data_title[j]])[0]))r.append(pearsonr(data[data_title[i]],data[data_title[j]])[0])

可以算出兩兩特征之間的相關系數,如下圖:

相關系數大致可以理解成三種情況:
當相關系數為0時,X和Y兩變量無關系。
當X的值增大(減小),Y值增大(減小),兩個變量為正相關,相關系數在[0,1]之間。
當X的值增大(減小),Y值減小(增大),兩個變量為負相關,相關系數在[-1,0]之間。
通俗講就是相關系數越接近于1或-1,兩變量相關性越強

for i in range(len(r)):if r[i]>0.6:print(r[i])print(i)else:continue

索引出相關系數大于0.6,即相關性比較強的特征

0.838966454904582930
0.615500965009836440

即上圖兩個紅框里的特征:殘留糖和密度、游離二氧化硫和總二氧化硫
殘留糖和密度的相關性達到了0.83,已經是強相關,所以這里選擇刪去密度這一特征
在游離二氧化硫和總二氧化硫之間可以嘗試進行特征選擇

def Quality(e):if e>0 and e<=4:return 'inferior'elif e>4 and e<=7:return 'ordinary'else:return 'superior' data['Quality'] = data['quality'].map(Quality) data.drop(['quality'],axis=1,inplace=True)

從數據簡介中了解到葡萄酒的質量等級分為0-10,分布太廣,并且過于細致,為了建模后利于分類,所以將質量分為三個等級:劣質(inferior)、普通(ordinary)、優質(superior)

利用算法建模

在進行建模之間需要對數據集進行劃分,即將數據集分為訓練集和目標集

#劃分數據集 x_train,x_test,y_train,y_test = train_test_split(data2,data3,test_size =0.2,random_state = 6)

data2為所有的特征,data3為目標值,test_size控制劃分程度,即數據中**80%**為訓練集,**20%**為測試集
因為有三種方法進行建模,所以控制隨機種子相同,便于觀察對于該數據集哪一種算法的準確率更高一些

KNN(K最鄰近)

所謂K最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。kNN算法的核心思想是如果一個樣本在特征空間中的k個最相鄰的樣本中的大多數屬于某一個類別,則該樣本也屬于這個類別,并具有這個類別上樣本的特性。

#標準化 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) #得出最優模型 print('最佳結果:\n',estimator1.best_estimator_)

在許多方法的預估器中有超參數,即需要訓練者人工輸入并作出調整的變量,網格搜索就是選擇訓練者設置的可選參數值并預估出最優的結果,是算法調優的一種常用方法
KNN建模結果如下圖:

決策樹

決策樹是一種典型的分類方法,首先對數據進行處理,利用歸納算法生成可讀的規則和決策樹,然后使用決策對新數據進行分析。本質上決策樹是通過一系列規則對數據進行分類的過程。

#決策樹預估器 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)

決策樹的劃分依據之一是信息增益,也算是決策樹的一種調優,可以自行了解
決策樹建模結果如下圖:

隨機森林

隨機森林是一個包含多個決策樹的分類器, 并且其輸出的類別是由個別樹輸出的類別的眾數而定

#隨機森林評估器 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) #得出最優模型 print('最佳結果:\n',estimator2.best_estimator_)

隨機森林超參數較多,所以運行時間比較長,也可以利用網格搜索設置不同的參數值進行調優
隨機森林建模結果如下圖:

總結

KNN模型準確率:0.9316326530612244
決策樹模型準確率:0.9122448979591836
隨機森林準確率:0.9510204081632653
三個模型的準確率都還可以,其中隨機森林的準確率達到了95%,比較客觀
如果想要提高模型的準確率:異常值處理、更佳細致的特征工程、超參數的調節
沒有免費的午餐:
雖然隨機森林的準確率比較高,但是不能說隨機森林算法就優于其他算法甚至代替其他算法,每一種算法都有適合自己的數據,每一種算法的應用場景也是不同的

總結

以上是生活随笔為你收集整理的机器学习入门级实例——针对葡萄酒质量进行建模的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。