sklearn庫的學習

轉:https://blog.csdn.net/u014248127/article/details/78885180  
本篇文章主要從兩個方面出發:1,介紹sklearn官方文檔的類容和結構;2,從機器學習重要步驟出發講清楚sklearn的使用方法。

一、sklearn官方文檔的類容和結構 
1,機器學習的認識:從實踐的角度出發,機器學學習要做的工作就是在我們有的一個數據集上建立一個或者多個模型,然後對我們的模型進行優化和評估。我們將會在sklearn中看到下圖各個模塊到底是什麼,怎麼用。 


2,sklearn庫官方文檔結構: 
下圖表示:官方文檔有很多模塊: 
tutorials:是一個官方教程,可以理解快速上手教程,但是看完感覺並沒有很快。 
user guide(用戶指南):這裏對每一個算法有詳細的介紹 
API:這裏是庫調用的方法 
FAQ:常見問題 
contributing:貢獻,還介紹最新的一些代碼,功能。 
(下面三個就跟沒有用了) 
 
總結:一般的做法是API裏面找到你要調用的方法,然後可以查看方法參數的情況和使用情況。也可以在指南里面找到具體的解釋。

3,sklearn庫的結構: 
 
(1)結構: 
由圖中,可以看到庫的算法主要有四類:分類,迴歸,聚類,降維。其中:


常用的迴歸:線性、決策樹、SVM、KNN ;集成迴歸:隨機森林、Adaboost、GradientBoosting、Bagging、ExtraTrees
常用的分類:線性、決策樹、SVM、KNN,樸素貝葉斯;集成分類:隨機森林、Adaboost、GradientBoosting、Bagging、ExtraTrees
常用聚類:k均值(K-means)、層次聚類(Hierarchical clustering)、DBSCAN
常用降維:LinearDiscriminantAnalysis、PCA


(2)圖片中隱含的操作流程: 
這個流程圖代表:藍色圓圈內是判斷條件,綠色方框內是可以選擇的算法。你可以根據自己的數據特徵和任務目標去找到一條自己的操作路線,一步步做就好了。

二、機器學習主要步驟中sklearn應用 
1,數據集:面對自己的任務肯定有自己的數據集,但是對於學習來說,sklearn提供了一些數據,主要有兩部分:現在網上一些常用的數據集,可以通過方法加載;另一種sklearn可以生成數據,可以生成你設定的數據。(設定規模,噪聲等) 


下面是一段python實例:

from sklearn import datasets
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt

#使用以後的數據集進行線性迴歸(這裏是波士頓房價數據)
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])

#使用生成線性迴歸的數據集,最後的數據集結果用散點圖表示
X,y=datasets.make_regression(n_samples=100,n_features=1,n_targets=1,noise=10)   #n_samples表示樣本數目,n_features特徵的數目  n_tragets  noise噪音
plt.scatter(X,y)
plt.show()12345678910111213141516171819

2,數據預處理:數據預處理包括:降維、數據歸一化、特徵提取和特徵轉換(one-hot)等,這在sklearn裏面有很多方法,具體查看api。這裏用歸一化(preprocessing.scale() )例子解釋一下:

 

from sklearn import preprocessing #進行標準化數據時,需要引入個包
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 沒有 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)   #每一列代表一個屬性
print(a) #標準化之前a
print(preprocessing.scale(a)) #標準化之後的a 1234567891011121314151617181920212223242526

3,選擇模型並訓練: sklearn裏面有很多的機器學習方法,可以查看api找到你需要的方法,sklearn統一了所有模型調用的api,使用起來還是比較簡單。

from sklearn import datasets
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt

#使用以後的數據集進行線性迴歸
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])

#參數
print(model.coef_)      #如果y=0.1x+0.3   則此行輸出的結果爲0.1
print(model.intercept_)             #此行輸出的結果爲0.3
print(model.get_params())       #模型定義時定義的參數,如果沒有定義則返回默認值
print(model.score(data_X,data_y))   #給訓練模型打分,注意用在LinearR中使用R^2 conefficient of determination打分1234567891011121314151617181920

4,模型評分: 
(1)模型的score方法:最簡單的模型評估方法是調用模型自己的方法:

    #預測
    y_predict = knnClf.predict(x_test)
    print("score on the testdata:",knnClf.score(x_test,y_test))123

(2)sklearn的指標函數:庫提供的一些計算方法,常用的有classification_report方法 


下面是一個svm分類器,是關於圖片分類的,具體數據這裏沒有給出,大家只需要關注模型的評估就好。

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   則此行輸出的結果爲0.1
    # print(svc.intercept_)  # 此行輸出的結果爲0.3
    print(svc.get_params())  # 模型定義時定義的參數,如果沒有定義則返回默認值

    #可能性計算
    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)12345678910111213141516171819202122232425262728293031323334353637383940414243

(3)sklearn也支持自己開發評價方法

5,模型的保存於恢復:模型的保存與恢復可以採用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]))
 

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