使用UCI兩個數據集,使用Python的Sklearn比較神經網絡、支持向量機、貝葉斯三個模型的好壞(附簡單詳細代碼)

數據集說明

數據下載地址:https://archive.ics.uci.edu/ml/index.php
data文件爲數據,由逗號分開,names文件爲數據說明。data文件可以用excel打開。
70%數據用於訓練集,30%是測試集。

快速下載Sklearn的各種包

cmd+R,然後輸入下面代碼,下自己需要的包就好

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple *****

Wine數據集

這些數據包括了三種酒中13種不同成分的數量。13種成分分別爲:Alcohol,Malicacid,Ash,Alcalinity of ash,Magnesium,Total phenols,Flavanoids,Nonflavanoid phenols,Proanthocyanins,Color intensity,Hue,OD280/OD315 of diluted wines,Proline。在 “wine.data”文件中,每行代表一種酒的樣本,共有178個樣本;一共有14列,其中,第一列爲類標誌屬性,共有三類,分別記爲“1”,“2”,“3”;後面的13列爲每個樣本的對應屬性的樣本值。其中第1類有59個樣本,第2類有71個樣本,第3類有48個樣本。

Iris數據集

Iris也稱鳶尾花卉數據集,是一類多重變量分析的數據集。通過花萼長度,花萼寬度,花瓣長度,花瓣寬度4個屬性預測鳶尾花卉屬於(Setosa,Versicolour,Virginica)三個種類中的哪一類。
在這裏插入圖片描述

代碼

其中包含了樸素貝葉斯的高斯模型和伯努利模型,SVM分別使用三種核函數。
在對數據集分割上寫的很low,反正數據量不大,就用笨方法來了。可以自行優化。
有個坑是在分訓練集和數據集時要先打亂順序,不然比如紅酒數據會沒有用到第3類來訓練(使用Shuffle),最後測試集都是1或者2類,準確率0.76。。。很難受!-_-!

import pandas as pd
import random
import sklearn.svm as svm
from sklearn.preprocessing import StandardScaler
from sklearn.neural_network import MLPClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.naive_bayes import MultinomialNB
from sklearn.naive_bayes import BernoulliNB
from sklearn.utils import shuffle
from sklearn.svm import SVC

souce_data = pd.read_csv("C:\\Users\\jwj13\\Desktop\\MyCode\\機器學習\\wine.data")
print("數據量:{}".format(len(souce_data)))#177
print("數據列數:{}".format(souce_data.columns.size))#14
souce_data = shuffle(souce_data)#數據隨機排列
x_train=souce_data.iloc[:125,1:14]#0到124行;1-14列,訓練集
y_train=souce_data.iloc[:125,0]#訓練結果集
x_test=souce_data.iloc[125:,1:14]#測試集
y_test=souce_data.iloc[125:,0]#測試集的目標結果集

print("*****1.使用神經網絡進行訓練*****")
# 神經網絡對數據尺度敏感,所以最好在訓練前標準化,或者歸一化,或者縮放到[-1,1]
#數據標準化
scaler = StandardScaler() # 標準化轉換
scaler.fit(x_test)  # 訓練標準化對象
x_test_Standard= scaler.transform(x_test)   # 轉換數據集
scaler.fit(x_train)  # 訓練標準化對象
x_train_Standard= scaler.transform(x_train)   # 轉換數據集
y_test1=y_test.tolist()
print("測試集的目標類別:{}".format(y_test1))

bp=MLPClassifier(hidden_layer_sizes=(500,3 ), activation='relu', solver='lbfgs', alpha=0.0001, batch_size='auto',learning_rate='constant')
bp.fit(x_train_Standard,y_train.astype('int'))
y_predict_mlp=bp.predict(x_test_Standard)#預測的結果集
y_predict_mlp=list(y_predict_mlp)
print("MLP預測準確率:{}".format(sum([1 for n in range(len(y_test1)) if y_predict_mlp[n]==y_test1[n] ])/len(y_test1)))

print("*****2.使用樸素貝葉斯進行訓練*****")
#高斯
gauNB = GaussianNB()
gauNB.fit(x_train_Standard,y_train.astype('int'))
y_predict_gau = gauNB.predict(x_test_Standard)
y_predict_gau=list(y_predict_gau)
#print(y_predict_gau)
print("高斯模型預測準確率:{}".format(sum([1 for n in range(len(y_test1)) if y_predict_gau[n]==y_test1[n] ])/len(y_test1)))
#伯努利
berNB = BernoulliNB()
berNB.fit(x_train_Standard,y_train.astype('int'))
y_predict_ber = berNB.predict(x_test_Standard)
y_predict_ber=list(y_predict_ber)
#print(y_predict_ber)
print("伯努利模型預測準確率:{}".format(sum([1 for n in range(len(y_test1)) if y_predict_ber[n]==y_test1[n] ])/len(y_test1)))

print("*****3.使用支持向量機進行訓練*****")
# 訓練svm模型---基於線性核函數
model1 = svm.SVC(kernel='linear')
# 訓練svm模型---基於多項式核函數
model2 = svm.SVC(kernel='poly', degree=3)
# 訓練svm模型---基於徑向基核函數
model3 = svm.SVC(kernel='rbf', C=600)

model1.fit(x_train_Standard, y_train)
y_predict_svm1 = model1.predict(x_test_Standard)
y_predict_svm1=list(y_predict_svm1)
print("SVM(基於線性核函數)預測準確率:{}".format(sum([1 for n in range(len(y_test1)) if y_predict_svm1[n]==y_test1[n] ])/len(y_test1)))

model2.fit(x_train_Standard, y_train)
y_predict_svm2 = model2.predict(x_test_Standard)
y_predict_svm2=list(y_predict_svm2)
print("SVM(基於多項式核函數)預測準確率:{}".format(sum([1 for n in range(len(y_test1)) if y_predict_svm2[n]==y_test1[n] ])/len(y_test1)))

model3.fit(x_train_Standard, y_train)
y_predict_svm3 = model3.predict(x_test_Standard)
y_predict_svm3=list(y_predict_svm3)
print("SVM(基於徑向基核函數)預測準確率:{}".format(sum([1 for n in range(len(y_test1)) if y_predict_svm3[n]==y_test1[n] ])/len(y_test1)))

Iris數據集:
(除訓練集測試集分割代碼不同,其他與第一個數據集幾乎一致)

souce_data = pd.read_csv("C:\\Users\\jwj13\\Desktop\\MyCode\\機器學習\\iris.data")
print("數據量:{}".format(len(souce_data)))
print("數據列數:{}".format(souce_data.columns.size))
souce_data = shuffle(souce_data)#數據隨機排列
x_train=souce_data.iloc[:105,0:4]#0到104行;前4列,訓練集
y_train=souce_data.iloc[:105,4]#訓練結果集
x_test=souce_data.iloc[105:,0:4]#測試集
y_test=souce_data.iloc[105:,4]#測試集的目標結果集,第5列

輸出結果

1圖1 Wine數據集結果
在這裏插入圖片描述
圖2 iris數據集結果
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章