1. 程式人生 > >機器學習scikit-learn(一)

機器學習scikit-learn(一)

機器學習scikit-learn

在資料分析過程中,我們經常會碰到各種各樣的問題。如何獲取外部資料?如何處理髒資料?如何處理缺失值?若有許多特徵,我們減少特徵?建立各種模型中演算法的細節?到最後,面對多種模型,我們該如何選擇?這些問題,都將在此文中得到解答。此文分為五個部分:

  • 建立模型的之前的工作
  • 建立線性模型
  • 聚類分析
  • 分類
  • 建立模型之後的工作

建立模型前的工作

如何從外界獲取資料?

獲取外界資料有很多種方法,有直接下載、API和爬蟲等,這裡只介紹scikit-learn內建的資料,這些資料用來熟悉各種演算法。

from sklearn import datasets #sklearn有資料集的模組

其中的資料有兩類,一類是小資料,直接包含在模組之中;另一類是大資料,需要你自己下載,sklearn提供函式下載。

boston = datasets.load_boston()#從資料集中載入波斯頓資料
print boston.DESCR #可以檢視資料的描述
housing = datasets.fetch_california_housing() #從網上下載大資料

這些資料被載入時,不是Numpy的array格式,而是一個叫Bunch的格式,Bunch是一個特殊的字典,字典中的Keys作為資料的屬性。

X,y = boston.data,boston.target #X為特徵資料,有y是預測資料  

UCI Machine Learning Repository其中有更多的資料集用來實驗演算法,我們可以盡情的利用這些資料集,而不用擔心,自己學習了各種演算法,而沒有資料集去實現!

為簡單的分析生成樣本資料

datasets模組中有一個make_函式,可以生成一些簡單的資料,以便於分析。

import sklearn.datasets as d #簡寫為了方便
reg_data = d.make_regression() #生成迴歸資料
complex_reg_data = d.make_regression(1000,10,5,2,1.0) #生成複雜點的迴歸資料-1000*10的矩陣,5個有效變數,2個目標變數,1.0的偏差
classification_set = d.make_classification(weight=[0.1]) #生成分類資料
blobs = d.make_blobs() #生成聚類資料  

datasets模組中還有更多的函式去生成各種各樣的資料,可以看一看,等需要的時候再用。

標準化資料

縮放資料是非常重要的步驟,許多機器學習演算法,在資料有不同的尺度的情況下根本無法發揮用處。比如利用支援向量機進行預測,當你的一個特徵變數是0-1,而另一個變數的範圍卻是0-10000,這時支援向量機的表現會非常差,以至於產生一個錯誤的模型。我們常用的標準化的方法是正態化,z-scores。scikit-learn有一個preprocessing模組,利用這個模組中的scale、StandardScaler和MinMaxScaler我們就可以進行縮放資料的操作。

from sklearn import preprocessing
X_2 = preprocessing.scale(X) #縮放波斯頓特徵資料,將標準差都變為1.
my_scaler = preprocessing.StandardScaler() #與以上相同
my_scaler.fit(X)
my_scaler.transform(X)
#也可以縮放範圍
my_minmax_scaler = preprocessing.MinMaxScaler() #縮放範圍,預設為[0,1]
my_minmax_scaler.fit(x)
my_minmax_scaler.transform(x)
my_odd_scaler = preprocessing.MinMaxScaler(feature_range = (-5,5)) #縮放範圍改為[-5,5]

通過閾值建立二元變數

有一些變數是連續變數,我們想把它變成二元變數,利於分析。就比如決策樹中,我們有一變數是工資,為連續變數,而連續變數不利於決策樹建模,於是利用閾值將其分為二元變數,高工資和低工資。這個方法在preprocessing.binarize和preprocessing.Binarizer都可實現。

new_target=preprocessing.binarize(boston.target,threshold=boston.target.mean) #把波斯頓資料目標變數變成二元變數,閾值是均值,大於均值為1
bin = preprocessing.Binarizer(boston.target.mean())
new_target = bin.fit_transform(boston.target)

處理分類變數

分類變數能給我們提供更多的資訊,有時候卻非常麻煩,因為它可能是文字的,對於文字,我們根本無法用演算法進行分析。我們就需要去處理分類變數,將分類變數變成二元變數。例如分類變數紅色、綠色、黑色,我們根據其是否為紅色、綠色、黑色,轉化為二元變數。在sklearn裡有OneHotEncoder、DictVectorizer和patsy用來處理分類變數。

from sklearn import preprocessing
text_encoder = preprocessing.OneHotEncoder()
text_encoder.fit_transform(iris.target).toarray()

from sklearn.feature_extraction import DictVectorizer
dv = DictVectorzier()
my_dict = [{'species':iris.target_names[i]} for i in y]
dv.fit_transform(my_dict).toarray()

處理缺失值

如何處理缺失值在實踐中非常重要,幸運的是,我們有很多方法去處理缺失值。對於缺失值,我們可以直接去除這個樣本,如果你的樣本足夠多的話。但是一般我們都是用平均值、中位數和眾數去代替。其中實現的方法可以利用sklearn中的Imputer來進行處理。

from sklearn import preprocessing
impute = preprocessing.Imputer() #預設為平均值
impute.fit_transform(X)

流水線-多步驟預處理

當你的預處理步驟較多時,使用流水線比較方便,更有利於以後的交叉驗證。方法實現是利用pipeline.當我們不是用pipeline的預處理步驟是:

from sklearn import preprocessing
impute = preprocessing.Imputer()
scaler = preprocessing.StandarScaler()
X_imputed = impute.fit_transform(X)
X_imp_and_scaled = scaler.fit_transform(X)

而當我們使用pipeline時:

from sklearn import pipeline
pipe = pipeline.Pipeline([('impute',impute),('scaler',scaler)])
new_x = pipe.fit_transform(X)

降維

PCA是利用線性轉化把資料轉換到特徵空間中,得到前幾個能代表最多資訊的主成分,從而達到降維的目的,其實現方法是decompositin.PCA.

from sklearn import decomposition
pca = decomposition.PCA()
pca.fit_transform(X)
pca.explained_variance_ratio_

因子分析是另一種降維方法,其假定變數中有一些公共因子,公共因子的數目是少於變數的,這樣就達到降維的目的,其實現方法是decomposition.FactorAnalysis.

from sklearn import decomposition
fa = decomposition.FacorAnalysis()
fa.fit_transform(X)

核PCA是先利用核技巧把資料投射到高維空間,然後利用PCA進行降維。這種方法對非線性資料進行降維。核函式有:polynomial、rbf、sigmoid、cosine、precomputed

kpca = decomposition.KernelPCA(kernel='cosine',n_components=1)
X_transformed = kpca.fit_transform(X)

截斷SVD,截斷奇異值分解,是另一種降維方法,其可以用在稀疏矩陣而PCA不能。

from sklearn.decomposition import TruncatedSVD
svd = TruncatedSVD(2)
X_transformed = svd.fit_transform(X)

到此學習瞭如何獲取資料,如何對資料進行預處理(標準化、缺失值和降維),這些都是非常基礎的知識,也是非常重要的知識。下節我們會試試去建立簡單模型——線性模型。

參考:《scikit-learn cookbook》by Trent Hauck