網(wǎng)上有很多關(guān)于sklearn的學習教程,大部分都是簡單的講清楚某一個方面。其實最好的教程就是官方文檔(http://scikit-learn.org/stable/),但是官方文檔講述的太過于詳細,同時很多人對官方文檔的理解和結(jié)構(gòu)認識上都不能很好的把握。我寫這篇文章的目的是想用一篇文章講清楚整個sklearn庫,我會講清楚怎么樣用這個庫,而不是講清楚每一個知識點。(授人以魚不如授人以漁)(本文很多都是從實踐的角度出發(fā),也僅僅只代表我個人的認識)
本篇文章主要從兩個方面出發(fā):1,介紹sklearn官方文檔的類容和結(jié)構(gòu);2,從機器學習重要步驟出發(fā)講清楚sklearn的使用方法。
一、sklearn官方文檔的類容和結(jié)構(gòu)
1,機器學習的認識:從實踐的角度出發(fā),機器學學習要做的工作就是在我們有的一個數(shù)據(jù)集上建立一個或者多個模型,然后對我們的模型進行優(yōu)化和評估。我們將會在sklearn中看到下圖各個模塊到底是什么,怎么用。
2,sklearn庫官方文檔結(jié)構(gòu):
下圖表示:官方文檔有很多模塊:
tutorials:是一個官方教程,可以理解快速上手教程,但是看完感覺并沒有很快。
user guide(用戶指南):這里對每一個算法有詳細的介紹
API:這里是庫調(diào)用的方法
FAQ:常見問題
contributing:貢獻,還介紹最新的一些代碼,功能。
(下面三個就跟沒有用了)
3,sklearn庫的結(jié)構(gòu):
(2)圖片中隱含的操作流程:
這個流程圖代表:藍色圓圈內(nèi)是判斷條件,綠色方框內(nèi)是可以選擇的算法。你可以根據(jù)自己的數(shù)據(jù)特征和任務目標去找到一條自己的操作路線,一步步做就好了。
二、機器學習主要步驟中sklearn應用
1,數(shù)據(jù)集:面對自己的任務肯定有自己的數(shù)據(jù)集,但是對于學習來說,sklearn提供了一些數(shù)據(jù),主要有兩部分:現(xiàn)在網(wǎng)上一些常用的數(shù)據(jù)集,可以通過方法加載;另一種sklearn可以生成數(shù)據(jù),可以生成你設(shè)定的數(shù)據(jù)。(設(shè)定規(guī)模,噪聲等)
下面是一段python實例:
from sklearn import datasetsfrom sklearn.linear_model import LinearRegressionimport matplotlib.pyplot as plt#使用以后的數(shù)據(jù)集進行線性回歸(這里是波士頓房價數(shù)據(jù))loaded_data=datasets.load_boston()data_X=loaded_data.datadata_y=loaded_data.targetmodel=LinearRegression()model.fit(data_X,data_y)print(model.predict(data_X[:4,:]))print(data_y[:4])#使用生成線性回歸的數(shù)據(jù)集,最后的數(shù)據(jù)集結(jié)果用散點圖表示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ù)預處理:數(shù)據(jù)預處理包括:降維、數(shù)據(jù)歸一化、特征提取和特征轉(zhuǎn)換(one-hot)等,這在sklearn里面有很多方法,具體查看api。這里用歸一化(preprocessing.scale() )例子解釋一下:
from sklearn import preprocessing #進行標準化數(shù)據(jù)時,需要引入個包import numpy as npfrom sklearn.cross_validation import train_test_splitfrom sklearn.datasets.samples_generator import make_classificationfrom sklearn.svm import SVCimport matplotlib.pyplot as pltX,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 沒有 0.477777777778X_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) #每一列代表一個屬性print(a) #標準化之前a print(preprocessing.scale(a)) #標準化之后的a
3,選擇模型并訓練: sklearn里面有很多的機器學習方法,可以查看api找到你需要的方法,sklearn統(tǒng)一了所有模型調(diào)用的api,使用起來還是比較簡單。
from sklearn import datasetsfrom sklearn.linear_model import LinearRegressionimport matplotlib.pyplot as plt#使用以后的數(shù)據(jù)集進行線性回歸loaded_data=datasets.load_boston()data_X=loaded_data.datadata_y=loaded_data.targetmodel=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.1print(model.intercept_) #此行輸出的結(jié)果為0.3print(model.get_params()) #模型定義時定義的參數(shù),如果沒有定義則返回默認值print(model.score(data_X,data_y)) #給訓練模型打分,注意用在LinearR中使用R^2 conefficient of determination打分
4,模型評分:
(1)模型的score方法:最簡單的模型評估方法是調(diào)用模型自己的方法:
#預測 y_predict = knnClf.predict(x_test) print("score on the testdata:",knnClf.score(x_test,y_test))
(2)sklearn的指標函數(shù):庫提供的一些計算方法,常用的有classification_report方法
下面是一個svm分類器,是關(guān)于圖片分類的,具體數(shù)據(jù)這里沒有給出,大家只需要關(guān)注模型的評估就好。
def svmClassify(x_train, x_test, y_train, y_test): id = range(1, x_test.shape[0]+1) print("start run svm!") #訓練 svc = svm.SVC(kernel='rbf', C=10,probability=True) svc.fit(x_train, y_train) #預測 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ù),如果沒有定義則返回默認值 #可能性計算 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') # 查看每個錯誤 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也支持自己開發(fā)評價方法
5,模型的保存于恢復:模型的保存與恢復可以采用python的pickle,也可以用joblib的方法。
from sklearn import svmfrom sklearn import datasetsclf=svm.SVC()iris=datasets.load_iris()X,y=iris.data,iris.targetclf.fit(X,y)#method1:pickleimport pickle#savewith open('save/clf.pickle','wb')as f: pickle.dump(clf,f)#restorewith open('save/clf.pickle','rb') as f: clf=pickle.load(f) print(clf.predict(X[0:1]))#method2:joblibfrom sklearn.externals import joblib#savejoblib.dump(clf,'save/clf.pkl')clf3=joblib.load('save/clf.pkl')print(clf3.predict(X[0:1]))
這是一篇入門的文章,希望入門的人有一個很好的引導,接下來我也會跟新一些重要的內(nèi)容。下一篇,我打算講解交叉驗證這個很重要的模塊。
聯(lián)系客服