一、分類模型
1.KNN算法
函數(shù):KNeighborsClassifier()
思路:對(duì)k個(gè)最近的鄰居進(jìn)行擬合愉镰,調(diào)試出最佳n_neighbors的值订讼,分別對(duì)訓(xùn)練集纵装、驗(yàn)證集征讲、測(cè)試集的標(biāo)記值與預(yù)測(cè)值進(jìn)行擬合,用參數(shù)accuracy_score \recall_score \f1_score 對(duì)擬合效果進(jìn)行評(píng)定橡娄。
from sklearn.metrics import accuracy_score,recall_score,f1_score
from sklearn.neighbors import NearestNeighbors,KNeighborsClassifier
knn_clf = KNeighborsClassifier(n_neighbors=3)
knn_clf.fit(X_train,Y_train)
from sklearn.metrics import accuracy_score,recall_score,f1_score
print('Train')
Y_pred = knn_clf.predict(X_train)
print('ACC',accuracy_score(Y_train,Y_pred))
print('REC',recall_score(Y_train,Y_pred))
print('F-Score',f1_score(Y_train,Y_pred))
Y_pred = knn_clf.predict(X_validation)
print('Validation')
print('ACC',accuracy_score(Y_validation,Y_pred)) #準(zhǔn)確率
print('REC',recall_score(Y_validation,Y_pred)) #召回率
print('F-Score',f1_score(Y_validation,Y_pred)) #F值
Y_pred = knn_clf.predict(X_test)
print('Test')
print('ACC',accuracy_score(Y_test,Y_pred))
print('REC',recall_score(Y_test,Y_pred))
print('F-Score',f1_score(Y_test,Y_pred))
2.樸素貝葉斯算法
函數(shù):GaussianNB(), BernoulliNB()
思路:將上述代碼進(jìn)行優(yōu)化诗箍,建立models的list,將模型以元組形式存入list挽唉,用classifier name 和 classifier循環(huán)遍歷models扳还,分類擬合得到分類數(shù)組和標(biāo)簽,然后建立訓(xùn)練集橱夭、驗(yàn)證集、測(cè)試集及其對(duì)應(yīng)標(biāo)記值的list桑逝;循環(huán)遍歷每個(gè)xy_lst的元素棘劣,遍歷過(guò)程中將數(shù)組與標(biāo)簽分開(kāi),并進(jìn)行預(yù)測(cè)楞遏。最后通過(guò)評(píng)定參數(shù)accuracy_score茬暇、recall_score、f1_score寡喝,print預(yù)測(cè)值與標(biāo)記值的準(zhǔn)確率
from sklearn.metrics import accuracy_score,recall_score,f1_score
from sklearn.naive_bayes import GaussianNB,BernoulliNB
#用貝葉斯方法時(shí)糙俗,數(shù)據(jù)為離散值的情況下可能表現(xiàn)會(huì)更好一些
#高斯樸素貝葉斯(假設(shè)特征是高斯分布的),伯努利樸素貝葉斯(值是離散值用這個(gè)方法预鬓,如果是連續(xù)值要用伯努利進(jìn)行二值化)
models = []
models.append(('GaussianNB',GaussianNB()))
models.append(('BernoulliNB',BernoulliNB()))
for clf_name,clf in models:
clf.fit(X_train,Y_train)
xy_lst = [(X_train,Y_train),(X_validation,Y_validation),(X_test,Y_test)]
for i in range(len(xy_lst)):
X_part = xy_lst[i][0]
Y_part = xy_lst[i][1]
Y_pred = clf.predict(X_part)
print(i)
print(clf_name,'--ACC',accuracy_score(Y_part,Y_pred))
print(clf_name,'--REC',recall_score(Y_part,Y_pred))
print(clf_name,'--F_score',f1_score(Y_part,Y_pred))
3.決策樹(shù)
函數(shù):DecisionTreeClassifier()
思路:決策樹(shù)模型有兩種方法巧骚,一個(gè)是用Gini系數(shù),另一個(gè)是用entropy信息熵
from sklearn.tree import DecisionTreeClassifier,export_graphviz
from sklearn.externals.six import StringIO
models = []
models.append(('DecisionTreeGini',DecisionTreeClassifier(min_impurity_split=0.1))) # min_impurity_split=0.1 最小不純度格二,一種減枝方法
models.append(('DecisionTreeEntropy',DecisionTreeClassifier(criterion='entropy'))) # 信息增益方法的決策樹(shù)
for clf_name,clf in models:
clf.fit(X_train,Y_train)
xy_lst = [(X_train,Y_train),(X_validation,Y_validation),(X_test,Y_test)]
for i in range(len(xy_lst)):
X_part = xy_lst[i][0]
Y_part = xy_lst[i][1]
Y_pred = clf.predict(X_part)
print(i)
print(clf_name,'--ACC',accuracy_score(Y_part,Y_pred))
print(clf_name,'--REC',recall_score(Y_part,Y_pred))
print(clf_name,'--F_score',f1_score(Y_part,Y_pred))
dot_data = StringIO() #使用StringIO
export_graphviz(clf,out_file=dot_data,
feature_names=f_names,
class_names=['NL','L'],
filled=True,
rounded=True,
special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
graph.write_pdf('dt_tree2.pdf')
4.支持向量機(jī)SVM算法
函數(shù):SVC()
思路:先映射劈彪,再在低維空間計(jì)算,再用核函數(shù)擴(kuò)維
from sklearn.svm import SVC
models.append(('SVM Classifier',SVC(C=1000))) #通過(guò)C可以控制計(jì)算的準(zhǔn)確性
5.集成方法(ensemble)一隨機(jī)森林算法(Bagging)
函數(shù):RandomForestClassifier()
思想:每個(gè)決策樹(shù)可以并不使用全部特征顶猜,不需要剪值沧奴,即可有效避免過(guò)擬合恶耽。通過(guò)對(duì)訓(xùn)練數(shù)據(jù)集進(jìn)行隨機(jī)采樣苛聘,以重新組合成不同的數(shù)據(jù)集,利用弱學(xué)習(xí)算法對(duì)不同的新數(shù)據(jù)集進(jìn)行學(xué)習(xí)焕议,得到一系列的預(yù)測(cè)結(jié)果挠日,對(duì)這些預(yù)測(cè)結(jié)果做平均或者投票做出最終的預(yù)測(cè)疮绷。
from sklearn.ensemble import RandomForestClassifier
models.append(('OriginalForest',RandomForestClassifier())) #默認(rèn)n_estimators=10, 特征自動(dòng)選取
models.append(('RandomForest',RandomForestClassifier(max_features=None))) #取全部特征
6.集成方法(ensemble)一Adaboost 算法(Boosting)
函數(shù):AdaBoostClassifier()
思想:通過(guò)對(duì)樣本進(jìn)行不同的賦值,對(duì)錯(cuò)誤學(xué)習(xí)的樣本的權(quán)重設(shè)置的較大肆资,這樣在后續(xù)的學(xué)習(xí)中集中處理難學(xué)的樣本矗愧,最終得到一系列的預(yù)測(cè)結(jié)果,每個(gè)預(yù)測(cè)結(jié)果有一個(gè)權(quán)重,較大的權(quán)重表示該預(yù)測(cè)效果較好唉韭。
from sklearn.ensemble import AdaBoostClassifier
# n_estimators 弱學(xué)習(xí)的分類器的數(shù)量夜涕,默認(rèn)50;base_estimator 默認(rèn)為決策樹(shù)
models.append(('AdaBoost',AdaBoostClassifier(base_estimator=SVC(),n_estimators=100,algorithm='SAMME')))
二属愤、回歸模型
1.線性回歸: LinearDiscriminantAnalysis()
2.嶺回歸: Ridge()
3.Lasso回歸: Lasso()
from sklearn.linear_model import LinearRegression,Ridge,Lasso
regr = LinearRegression()
regr = Ridge(alpha=0.8) #用嶺回歸可以得到控制參數(shù)規(guī)模的作用女器,但作用不是很明顯
regr = Lasso(alpha=0.002) #通過(guò)控制參數(shù)的規(guī)模而達(dá)到一個(gè)更好的擬合效果
regr.fit(features.values,label.values)
Y_pred = regr.predict(features.values)
print('coef',regr.coef_) #看下擬合過(guò)后的參數(shù)
from sklearn.metrics import mean_squared_error #平均平方誤差
print('MSE',mean_squared_error(Y_pred,label.values))
4.邏輯回歸: LogisticRegression()
主要用于線性可分的數(shù)據(jù)集
from sklearn.linear_model import LogisticRegression
models.append(('LogisticRegression',LogisticRegression(C=1000,tol=1e-10,solver="sag",max_iter=10000)))
# 如果效果不好,可以通過(guò)調(diào)參來(lái)優(yōu)化住诸;
5.人工神經(jīng)網(wǎng)絡(luò): 用Keras進(jìn)行實(shí)現(xiàn)
主要用于非線性數(shù)據(jù)驾胆,主要應(yīng)用于圖像識(shí)別,語(yǔ)音識(shí)別贱呐,自然語(yǔ)言處理等
from keras.models import Sequential # Sequential 人工神經(jīng)網(wǎng)絡(luò)的容器丧诺,而這個(gè)容器是序列化(層級(jí)化)的
from keras.layers.core import Dense,Activation # Dense 稠密層(神經(jīng)網(wǎng)絡(luò)層),Activation激活函數(shù)
from keras.optimizers import SGD # SGD是隨機(jī)梯度下降算法
mdl = Sequential()
mdl.add(Dense(50,input_dim=len(f_v[0]))) # 先建一個(gè)稠密層表示輸入層奄薇,在輸入每一層的時(shí)候只需要表示輸出就可以了驳阎,\
#只有在輸入層的時(shí)候需要表示輸入,輸出代表下一個(gè)隱含神經(jīng)元的個(gè)數(shù)馁蒂,\
#先指定下一個(gè)隱含神經(jīng)元的個(gè)數(shù),eg:50呵晚;輸入維度與輸入數(shù)據(jù)維度保持一致
mdl.add(Activation('sigmoid'))
mdl.add(Dense(2)) # 輸出維度設(shè)定
mdl.add(Activation('softmax'))
sgd = SGD(lr=0.05) #lr指的是學(xué)習(xí)率,也就是梯度下降里的α沫屡,學(xué)習(xí)率越大意味著很可能擬合不到最優(yōu)點(diǎn)饵隙,所以lr不能取太大
mdl.compile(loss="mean_squared_error",optimizer="adam") # 編譯過(guò)程(建立模型的過(guò)程),loss指的是最優(yōu)化函數(shù)(損失函數(shù))\
# 每個(gè)輸出對(duì)應(yīng)的輸出值和要擬合的標(biāo)注值沮脖,進(jìn)行平方求和再開(kāi)方得到的值金矛,讓它最小,就是loss的含義; \
# optimizer 表示用什么樣的優(yōu)化器去優(yōu)化
mdl.fit(X_train,np.array([[0,1] if i == 1 else [1,0] for i in Y_train]),nb_epoch=20000,batch_size=8999)
# nb_epoch 表示迭代的次數(shù)勺届,合理取值绷柒; batch_size 隨機(jī)梯度算法每次選取的數(shù)量,由于本樣本數(shù)據(jù)量不是很大涮因,所以取全部訓(xùn)練集
# 結(jié)果不理想废睦,可以調(diào)整迭代次數(shù)nb_epoch 或 增加樣本數(shù)量batch_size;也可以調(diào)整學(xué)習(xí)率lr养泡,比如從0.01調(diào)整到0.05;\
# 也可以通過(guò)更改優(yōu)化器optimizer比如將sgd改為adam
xy_lst = [(X_train,Y_train),(X_validation,Y_validation),(X_test,Y_test)]
for i in range(len(xy_lst)):
X_part = xy_lst[i][0]
Y_part = xy_lst[i][1]
Y_pred = mdl.predict_classes(X_part) #輸出分類標(biāo)注
print(i)
print("NN",'--ACC',accuracy_score(Y_part,Y_pred))
print("NN",'--REC',recall_score(Y_part,Y_pred))
print("NN",'--F_score',f1_score(Y_part,Y_pred))
return
6.GBDT嗜湃,回歸樹(shù)和提升樹(shù): GradientBoostingClassifier()
from sklearn.ensemble import GradientBoostingClassifier
models.append(('GBDT',GradientBoostingClassifier(max_depth=6,n_estimators=100))) # max_depth 只是一個(gè)經(jīng)驗(yàn)值
# 參數(shù)learn_rate 第二個(gè)分類器已經(jīng)進(jìn)行了衰減進(jìn)行10%的衰減;criterion:mse