sklearn-監(jiān)督學(xué)習(xí)-分類與回歸

一、分類模型
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')
tree

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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末澜掩,一起剝皮案震驚了整個(gè)濱河市购披,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肩榕,老刑警劉巖刚陡,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惩妇,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡筐乳,警方通過(guò)查閱死者的電腦和手機(jī)歌殃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蝙云,“玉大人氓皱,你說(shuō)我怎么就攤上這事〔伲” “怎么了波材?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)身隐。 經(jīng)常有香客問(wèn)我廷区,道長(zhǎng),這世上最難降的妖魔是什么贾铝? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任躲因,我火速辦了婚禮,結(jié)果婚禮上忌傻,老公的妹妹穿的比我還像新娘。我一直安慰自己搞监,他們只是感情好水孩,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著琐驴,像睡著了一般俘种。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绝淡,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天宙刘,我揣著相機(jī)與錄音,去河邊找鬼牢酵。 笑死悬包,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的馍乙。 我是一名探鬼主播布近,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼丝格!你這毒婦竟也來(lái)了撑瞧?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤显蝌,失蹤者是張志新(化名)和其女友劉穎预伺,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡酬诀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年脏嚷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片料滥。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡然眼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出葵腹,到底是詐尸還是另有隱情高每,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布践宴,位于F島的核電站鲸匿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏阻肩。R本人自食惡果不足惜带欢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望烤惊。 院中可真熱鬧乔煞,春花似錦、人聲如沸柒室。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)雄右。三九已至空骚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間擂仍,已是汗流浹背囤屹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逢渔,地道東北人肋坚。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像肃廓,于是被迫代替她去往敵國(guó)和親冲簿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容