Python資料探勘入門與實踐---使用scikit-learn 估計器分類

蜘蛛俠不會飛發表於2018-07-16

本章的幾個概念:

           估計器(estimator) 用於分類、聚類和迴歸分析
          轉換器(transformer):用於資料預處理回來資料轉換
          流水線(pipeline): 組合資料探勘流程, 便於在此使用

 1.scikit-learn估計器

資料集下載地址:UCI

載入資料集:

#coding=gbk 
#python 資料探勘入門與實踐  
#第2章: 使用scikit-learn 估計器分類

#估計器(estimator) 用於分類、聚類和迴歸分析
#轉換器(transformer):用於資料預處理回來資料轉換
#流水線(pipeline): 組合資料探勘流程, 便於在此使用
import numpy as np
import csv 
X = np.zeros((351,34), dtype = 'float')
y = np.zeros((351,), dtype = 'int') #原文中dtype 為'float' ,此處應該為 int 型別,其自動將true 轉換成 1 ,false轉換成 0  

#載入資料集
with open(r'D:\datasets\ionosphere.csv','r') as input_file:
    reader = csv.reader(input_file)
    for i , row in enumerate(reader):
        data = [float(datum) for datum in row[:-1]]     #將前34個特徵儲存到x 中
        X[i]= data
        y[i] = row[-1]=='g'    #把字母型轉換成數值型
print(X[:5])
print(y[:9])

實現流程的標準化:

#建立訓練集和測試集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state= 14)

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()    #使用KNN 演算法
knn.fit(X_train, y_train)
y_predicted = knn.predict(X_test)
accuracy = np.mean(y_predicted == y_test) *100 
print('the accuracy is %.1f'%accuracy)      # the accuracy is 86.4

#使用交叉驗證
from sklearn.model_selection import cross_val_score
scores = cross_val_score(knn, X, y, scoring= 'accuracy')
average_score = np.mean(scores) * 100
print('the average accuracy is %.1f'%average_score+'%')     # the average accuracy is 82.3%
#作者say:考慮到還沒有進行調引數, 這個結果還是相當不錯     

設定引數:

#設定引數

#測試一系列的n_neighbors 一系列的值, 進行重複多次試驗, 觀察引數值帶來的結果之間的差異
ave_score =[]
all_score = []
for n_neighbors in range(1,21):
    estimator = KNeighborsClassifier(n_neighbors=n_neighbors)
    scores = cross_val_score(estimator, X, y, scoring= 'accuracy')
    all_score.append(scores)
    ave_score.append(np.mean(scores))
    
print(ave_score)

import matplotlib.pyplot as plt 
x1 = range(1,21)
plt.plot(x1, ave_score, '-o')
plt.show()          #有圖知道, 隨著 K 值得增大 , 整體的正確率趨勢是下降的

 

2.流水線在預處理中的使用

不同特徵的取值範圍千差萬別, 常見的方法是對不同的特徵進行規範化,使他們的特徵值落在相同的值域或者是屬於某幾個確定的類別
一旦解決這個問題, 不同的特徵型別對演算法的影響將大大降低, 分類的正確率就有大大的提升
sckit-learn 的預處理工具 稱為 轉換器(Transfomer),它接受原始資料集, 返回的是轉換後的資料集。除了,處理數值型的特徵還能用於抽取特徵

 

X_broken = np.array(X)
X_broken[:,::2] /=10    #每隔一行, 就把第二個特徵的值除以10

knn2 = KNeighborsClassifier()
broken_score = cross_val_score(knn2, X_broken, y, scoring='accuracy')
ave_broken_score = np.mean(broken_score)
print('the broken score accuracy is %.3f'%ave_broken_score) # the broken score accuracy is 0.715

#將特徵值轉換成 0 到1 之間,以解決問題
#標準預處理:使用MinMaxScalar 類進行規範化處理,規範到0到1 之間

#對X 進行預處理, 有些轉換器要求像訓練分類器那樣先進行訓練, 但是MinMaxScalar 不需要, 直接呼叫 fit_transform 函式,即可以完成訓練和轉換
from sklearn.preprocessing import MinMaxScaler
X_transform = MinMaxScaler().fit_transform(X_broken)

knn2 = KNeighborsClassifier()
transform_scores = cross_val_score(knn2, X_transform, y, scoring='accuracy')
ave_transform_scores = np.mean(transform_scores) * 100
#MinMaxScaler 將特徵規範到相同的值域, 這樣特徵就不會僅僅因為值大二具備更強的區分度
print('the x_transformed average score is %.2f'%ave_transform_scores)   #the x_transformed average score is 82.34

#流水線
#流水線的輸入為一系列的資料探勘的步驟, 其中最後一步必須是估計器, 前幾部是轉換器。
from sklearn.pipeline import Pipeline
scailing_pipeline = Pipeline([('scale', MinMaxScaler()),
                              ('knn', KNeighborsClassifier())])
scores1 = cross_val_score(scailing_pipeline, X_broken, y, scoring= 'accuracy')
pipeline_score = np.mean(scores1) *100
print('the accuracy is %.2f'%pipeline_score+'%')    # the accuracy is 82.34% 與上式結果是一樣的

 

相關文章