1. 程式人生 > >python︱sklearn一些小技巧的記錄

python︱sklearn一些小技巧的記錄

sklearn裡面包含內容太多,所以一些實用小技巧還是挺好用的。

1、LabelEncoder

簡單來說 LabelEncoder 是對不連續的數字或者文字進行編號

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
le.fit([1,5,67,100])
le.transform([1,1,100,67,5])

輸出: array([0,0,3,2,1])

2、OneHotEncoder

OneHotEncoder 用於將表示分類的資料擴維:

from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder()
ohe.fit([[1],[2],[3],[4]])
ohe.transform([2],[3],[1],[4]).toarray()

輸出:[ [0,1,0,0] , [0,0,1,0] , [1,0,0,0] ,[0,0,0,1] ]
正如keras中的keras.utils.to_categorical(y_train, num_classes)

.

3、sklearn.model_selection.train_test_split隨機劃分訓練集和測試集

一般形式:
train_test_split是交叉驗證中常用的函式,功能是從樣本中隨機的按比例選取train data和testdata,形式為:

X_train,X_test, y_train, y_test =
cross_validation.train_test_split(train_data,train_target,test_size=0.4, random_state=0)

引數解釋:

  • train_data:所要劃分的樣本特徵集
  • train_target:所要劃分的樣本結果
  • test_size:樣本佔比,如果是整數的話就是樣本的數量
  • random_state:是隨機數的種子。
  • 隨機數種子:其實就是該組隨機數的編號,在需要重複試驗的時候,保證得到一組一樣的隨機數。比如你每次都填1,其他引數一樣的情況下你得到的隨機陣列是一樣的。但填0或不填,每次都會不一樣。
    隨機數的產生取決於種子,隨機數和種子之間的關係遵從以下兩個規則:
  • 種子不同,產生不同的隨機數;種子相同,即使例項不同也產生相同的隨機數。
fromsklearn.cross_validation import train_test_split  
train= loan_data.iloc[0: 55596, :]  
test= loan_data.iloc[55596:, :]  
# 避免過擬合,採用交叉驗證,驗證集佔訓練集20%,固定隨機種子(random_state)  
train_X,test_X, train_y, test_y = train_test_split(train,  
                                                   target,  
                                                   test_size = 0.2,  
                                                   random_state = 0)  
train_y= train_y['label']  
test_y= test_y['label']  

.

4、pipeline

本節參考與文章:用 Pipeline 將訓練集引數重複應用到測試集
pipeline 實現了對全部步驟的流式化封裝和管理,可以很方便地使引數集在新資料集上被重複使用。

pipeline 可以用於下面幾處:

  • 模組化 Feature Transform,只需寫很少的程式碼就能將新的 Feature 更新到訓練集中。
  • 自動化 Grid Search,只要預先設定好使用的 Model 和引數的候選,就能自動搜尋並記錄最佳的 Model。
  • 自動化 Ensemble Generation,每隔一段時間將現有最好的 K 個 Model 拿來做 Ensemble。

問題是要對資料集 Breast Cancer Wisconsin 進行分類,
它包含 569 個樣本,第一列 ID,第二列類別(M=惡性腫瘤,B=良性腫瘤),
第 3-32 列是實數值的特徵。

from pandas as pd
from sklearn.cross_validation import train_test_split
from sklearn.preprocessing import LabelEncoder

df = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/'
                 'breast-cancer-wisconsin/wdbc.data', header=None)
                                 # Breast Cancer Wisconsin dataset

X, y = df.values[:, 2:], df.values[:, 1]

encoder = LabelEncoder()
y = encoder.fit_transform(y)
                    >>> encoder.transform(['M', 'B'])
                    array([1, 0])
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.2, random_state=0)

我們要用 Pipeline 對訓練集和測試集進行如下操作:

  • 先用 StandardScaler 對資料集每一列做標準化處理,(是 transformer)
  • 再用 PCA 將原始的 30 維度特徵壓縮的 2 維度,(是 transformer)
  • 最後再用模型 LogisticRegression。(是 Estimator)
  • 呼叫 Pipeline 時,輸入由元組構成的列表,每個元組第一個值為變數名,元組第二個元素是 sklearn 中的 transformer
    或 Estimator。

注意中間每一步是 transformer,即它們必須包含 fit 和 transform 方法,或者 fit_transform。
最後一步是一個 Estimator,即最後一步模型要有 fit 方法,可以沒有 transform 方法。

然後用 Pipeline.fit對訓練集進行訓練,pipe_lr.fit(X_train, y_train)
再直接用 Pipeline.score 對測試集進行預測並評分 pipe_lr.score(X_test, y_test)

from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression

from sklearn.pipeline import Pipeline

pipe_lr = Pipeline([('sc', StandardScaler()),
                    ('pca', PCA(n_components=2)),
                    ('clf', LogisticRegression(random_state=1))
                    ])
pipe_lr.fit(X_train, y_train)
print('Test accuracy: %.3f' % pipe_lr.score(X_test, y_test))

                # Test accuracy: 0.947

還可以用來選擇特徵:

例如用 SelectKBest 選擇特徵,
分類器為 SVM,

anova_filter = SelectKBest(f_regression, k=5)
clf = svm.SVC(kernel='linear')
anova_svm = Pipeline([('anova', anova_filter), ('svc', clf)])

當然也可以應用 K-fold cross validation:

model = Pipeline(estimators)
seed = 7
kfold = KFold(n_splits=10, random_state=seed)
results = cross_val_score(model, X, Y, cv=kfold)
print(results.mean())

Pipeline 的工作方式

當管道 Pipeline 執行 fit 方法時,
首先 StandardScaler 執行 fit 和 transform 方法,
然後將轉換後的資料輸入給 PCA,
PCA 同樣執行 fit 和 transform 方法,
再將資料輸入給 LogisticRegression,進行訓練。
這裡寫圖片描述

5 稀疏矩陣合併

from scipy.sparse import hstack
x_train_spar = hstack([x_train_ens_s, x_train_tfidf])
hstack([X, csr_matrix(char_embed), csr_matrix(word_embed)], format='csr')

多項式PolynomialFeatures,有點類似FFM模型,可以組合特徵

poly = PolynomialFeatures(degree=2, interaction_only=True, include_bias=False)
#degree控制多項式最高次數
x_train_new = poly.fit_transform(x_train)
**公眾號“素質雲筆記”定期更新部落格內容:**
![這裡寫圖片描述](https://img-blog.csdn.net/20180226155348545?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMjY5MTczODM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)