網(wǎng)上有很多關(guān)于sklearn的學(xué)習(xí)教程,,大部分都是簡(jiǎn)單的講清楚某一個(gè)方面,。其實(shí)最好的教程就是官方文檔(http:///stable/),但是官方文檔講述的太過(guò)于詳細(xì),,同時(shí)很多人對(duì)官方文檔的理解和結(jié)構(gòu)認(rèn)識(shí)上都不能很好的把握,。我寫(xiě)這篇文章的目的是想用一篇文章講清楚整個(gè)sklearn庫(kù),我會(huì)講清楚怎么樣用這個(gè)庫(kù),,而不是講清楚每一個(gè)知識(shí)點(diǎn),。(授人以魚(yú)不如授人以漁)(本文很多都是從實(shí)踐的角度出發(fā),也僅僅只代表我個(gè)人的認(rèn)識(shí))
本篇文章主要從兩個(gè)方面出發(fā):1,,介紹sklearn官方文檔的類(lèi)容和結(jié)構(gòu),;2,從機(jī)器學(xué)習(xí)重要步驟出發(fā)講清楚sklearn的使用方法,。
一,、sklearn官方文檔的類(lèi)容和結(jié)構(gòu)
1,,機(jī)器學(xué)習(xí)的認(rèn)識(shí):從實(shí)踐的角度出發(fā),機(jī)器學(xué)學(xué)習(xí)要做的工作就是在我們有的一個(gè)數(shù)據(jù)集上建立一個(gè)或者多個(gè)模型,,然后對(duì)我們的模型進(jìn)行優(yōu)化和評(píng)估,。我們將會(huì)在sklearn中看到下圖各個(gè)模塊到底是什么,怎么用,。
2,,sklearn庫(kù)官方文檔結(jié)構(gòu):
下圖表示:官方文檔有很多模塊:
tutorials:是一個(gè)官方教程,可以理解快速上手教程,,但是看完感覺(jué)并沒(méi)有很快,。
user guide(用戶(hù)指南):這里對(duì)每一個(gè)算法有詳細(xì)的介紹
API:這里是庫(kù)調(diào)用的方法
FAQ:常見(jiàn)問(wèn)題
contributing:貢獻(xiàn),還介紹最新的一些代碼,,功能,。
(下面三個(gè)就跟沒(méi)有用了)
總結(jié):一般的做法是API里面找到你要調(diào)用的方法,然后可以查看方法參數(shù)的情況和使用情況,。也可以在指南里面找到具體的解釋,。
3,sklearn庫(kù)的結(jié)構(gòu):
(1)結(jié)構(gòu):
由圖中,,可以看到庫(kù)的算法主要有四類(lèi):分類(lèi),,回歸,聚類(lèi),,降維,。其中:
- 常用的回歸:線性、決策樹(shù),、SVM,、KNN ;集成回歸:隨機(jī)森林,、Adaboost,、GradientBoosting、Bagging,、ExtraTrees
- 常用的分類(lèi):線性,、決策樹(shù)、SVM,、KNN,,樸素貝葉斯;集成分類(lèi):隨機(jī)森林,、Adaboost,、GradientBoosting、Bagging、ExtraTrees
- 常用聚類(lèi):k均值(K-means),、層次聚類(lèi)(Hierarchical clustering),、DBSCAN
- 常用降維:LinearDiscriminantAnalysis、PCA
(2)圖片中隱含的操作流程:
這個(gè)流程圖代表:藍(lán)色圓圈內(nèi)是判斷條件,,綠色方框內(nèi)是可以選擇的算法,。你可以根據(jù)自己的數(shù)據(jù)特征和任務(wù)目標(biāo)去找到一條自己的操作路線,一步步做就好了,。
二,、機(jī)器學(xué)習(xí)主要步驟中sklearn應(yīng)用
1,數(shù)據(jù)集:面對(duì)自己的任務(wù)肯定有自己的數(shù)據(jù)集,,但是對(duì)于學(xué)習(xí)來(lái)說(shuō),,sklearn提供了一些數(shù)據(jù),主要有兩部分:現(xiàn)在網(wǎng)上一些常用的數(shù)據(jù)集,,可以通過(guò)方法加載,;另一種sklearn可以生成數(shù)據(jù),可以生成你設(shè)定的數(shù)據(jù),。(設(shè)定規(guī)模,,噪聲等)
下面是一段python實(shí)例:
from sklearn import datasets
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
#使用以后的數(shù)據(jù)集進(jìn)行線性回歸(這里是波士頓房?jī)r(jià)數(shù)據(jù))
loaded_data=datasets.load_boston()
data_X=loaded_data.data
data_y=loaded_data.target
model=LinearRegression()
model.fit(data_X,data_y)
print(model.predict(data_X[:4,:]))
print(data_y[:4])
#使用生成線性回歸的數(shù)據(jù)集,最后的數(shù)據(jù)集結(jié)果用散點(diǎn)圖表示
X,y=datasets.make_regression(n_samples=100,n_features=1,n_targets=1,noise=10) #n_samples表示樣本數(shù)目,,n_features特征的數(shù)目 n_tragets noise噪音
plt.scatter(X,y)
plt.show()
2,,數(shù)據(jù)預(yù)處理:數(shù)據(jù)預(yù)處理包括:降維、數(shù)據(jù)歸一化,、特征提取和特征轉(zhuǎn)換(one-hot)等,,這在sklearn里面有很多方法,具體查看api,。這里用歸一化(preprocessing.scale() )例子解釋一下:
from sklearn import preprocessing #進(jìn)行標(biāo)準(zhǔn)化數(shù)據(jù)時(shí),,需要引入個(gè)包
import numpy as np
from sklearn.cross_validation import train_test_split
from sklearn.datasets.samples_generator import make_classification
from sklearn.svm import SVC
import matplotlib.pyplot as plt
X,y=make_classification(n_samples=300,n_features=2,n_redundant=0,n_informative=2,random_state=22,n_clusters_per_class=1,scale=100)
#X=preprocessing.minmax_scale(X,feature_range=(-1,1))
X=preprocessing.scale(X) #0.966666666667 沒(méi)有 0.477777777778
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3)
clf=SVC()
clf.fit(X_train,y_train)
print(clf.score(X_test,y_test))
plt.scatter(X[:,0],X[:,1],c=y)
plt.show()
a=np.array([[10,2.7,3.6],
[-100,5,-2],
[120,20,40]],dtype=np.float64) #每一列代表一個(gè)屬性
print(a) #標(biāo)準(zhǔn)化之前a
print(preprocessing.scale(a)) #標(biāo)準(zhǔn)化之后的a
3,選擇模型并訓(xùn)練: sklearn里面有很多的機(jī)器學(xué)習(xí)方法,,可以查看api找到你需要的方法,,sklearn統(tǒng)一了所有模型調(diào)用的api,使用起來(lái)還是比較簡(jiǎn)單,。
from sklearn import datasets
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
#使用以后的數(shù)據(jù)集進(jìn)行線性回歸
loaded_data=datasets.load_boston()
data_X=loaded_data.data
data_y=loaded_data.target
model=LinearRegression()
model.fit(data_X,data_y)
print(model.predict(data_X[:4,:]))
print(data_y[:4])
#參數(shù)
print(model.coef_) #如果y=0.1x+0.3 則此行輸出的結(jié)果為0.1
print(model.intercept_) #此行輸出的結(jié)果為0.3
print(model.get_params()) #模型定義時(shí)定義的參數(shù),如果沒(méi)有定義則返回默認(rèn)值
print(model.score(data_X,data_y)) #給訓(xùn)練模型打分,,注意用在LinearR中使用R^2 conefficient of determination打分
4,,模型評(píng)分:
(1)模型的score方法:最簡(jiǎn)單的模型評(píng)估方法是調(diào)用模型自己的方法:
#預(yù)測(cè)
y_predict = knnClf.predict(x_test)
print("score on the testdata:",knnClf.score(x_test,y_test))
(2)sklearn的指標(biāo)函數(shù):庫(kù)提供的一些計(jì)算方法,常用的有classification_report方法
下面是一個(gè)svm分類(lèi)器,,是關(guān)于圖片分類(lèi)的,,具體數(shù)據(jù)這里沒(méi)有給出,大家只需要關(guān)注模型的評(píng)估就好,。
def svmClassify(x_train, x_test, y_train, y_test):
id = range(1, x_test.shape[0]+1)
print("start run svm!")
#訓(xùn)練
svc = svm.SVC(kernel='rbf', C=10,probability=True)
svc.fit(x_train, y_train)
#預(yù)測(cè)
y_predict = svc.predict(x_test)
print("svm mode's score on the test data:",svc.score(x_test,y_test))
print("svm mode's evaluate:",classification_report(y_test,y_predict))
# print(svc.coef_) # 如果y=0.1x+0.3 則此行輸出的結(jié)果為0.1
# print(svc.intercept_) # 此行輸出的結(jié)果為0.3
print(svc.get_params()) # 模型定義時(shí)定義的參數(shù),,如果沒(méi)有定義則返回默認(rèn)值
#可能性計(jì)算
probablity = svc.predict_proba(x_test)
list_pro = []
for i in range(probablity.shape[0]):
pro = max(list(probablity[i]))
list_pro.append(pro)
#輸出
index = np.array(id).reshape(-1,1)
result = pd.DataFrame(np.column_stack((np.array(id).reshape(-1, 1), np.array(y_test).reshape(-1, 1),np.array(y_predict).reshape(-1,1),np.array(list_pro).reshape(-1,1))),
columns=['ImageId','test_label','predict_lable','probablity'])
result.to_csv("result/svm_result.csv", index=False, header=True, encoding='gbk')
diff_index = []
for i in range(result.shape[0]):
# print(result['test_label'][i], result['predict_lable'][i],)
diff_index.append(result['test_label'][i] != result['predict_lable'][i])
print(diff_index)
diff = result[diff_index]
diff_x = x_test_original[diff_index]
diff.to_csv('result/svm_result_diff.csv', index=False, header=True, encoding='gbk')
# 查看每個(gè)錯(cuò)誤
for i in range(len(diff_index)):
# print("label is:",diff['test_label'][i],"predict is:",diff['predict_lable'][i])
print("test label is :", diff.iloc[i]['test_label'], 'predict label is :', diff.iloc[i]['predict_lable'])
x = diff_x[i]
img = x.reshape(28, 28)
image_show(img)
(3)sklearn也支持自己開(kāi)發(fā)評(píng)價(jià)方法
5,模型的保存于恢復(fù):模型的保存與恢復(fù)可以采用python的pickle,,也可以用joblib的方法,。
from sklearn import svm
from sklearn import datasets
clf=svm.SVC()
iris=datasets.load_iris()
X,y=iris.data,iris.target
clf.fit(X,y)
#method1:pickle
import pickle
#save
with open('save/clf.pickle','wb')as f:
pickle.dump(clf,f)
#restore
with open('save/clf.pickle','rb') as f:
clf=pickle.load(f)
print(clf.predict(X[0:1]))
#method2:joblib
from sklearn.externals import joblib
#save
joblib.dump(clf,'save/clf.pkl')
clf3=joblib.load('save/clf.pkl')
print(clf3.predict(X[0:1]))
這是一篇入門(mén)的文章,,希望入門(mén)的人有一個(gè)很好的引導(dǎo),接下來(lái)我也會(huì)跟新一些重要的內(nèi)容,。下一篇,,我打算講解交叉驗(yàn)證這個(gè)很重要的模塊。
|