機器學習很難,sklearn很簡單

好吧,我標題黨了,sklearn的簡單也是相對於機器學習原理本身,要學好也不容易!

人工智能、機器學習,一聽就是高大上的東西,想學會肯定很難。這是當然的,要理解機器學習中的各種算法模型,還是需要較強的數學功底的,這無形中提高了機器學習的門檻。但是隻是要用它,卻並不困難,scikit-learn的出現給程序員帶來了福音,極大的降低了機器學習使用的門檻,即使你不求甚解,也能純熟的使用各種機器學習的算法來完成自己的目標。

1 sklearn介紹

Scikit learn 也簡稱 sklearn, 是機器學習領域當中最知名的 python 模塊之一.
Sklearn 包含了很多種機器學習的方式:

  • Classification 分類
  • Regression 迴歸
  • Clustering 非監督分類
  • Dimensionality reduction 數據降維
  • Model Selection 模型選擇
  • Preprocessing 數據預處理

我們總能夠從這些方法中挑選出一個適合於自己問題的, 然後用來解決自己的問題.

scikit-learn官網:
https://scikit-learn.org/
在這裏插入圖片描述

2 一個栗子

我們還是用一個例子來直觀感受一下sklearn的用法。

問題:一個分類問題,把下圖所展示的紅藍點分開
在這裏插入圖片描述
怎麼做呢,幾行代碼搞定:

from sklearn.linear_model import LogisticRegression   
#初始化模型 
clf_LR = LogisticRegression()     
#訓練數據 
clf_LR.fit(features_train,label_train)    
#預測 
label pred_LR = clf_LR.predict(features_test)    
#評估模型 
acc = accuracy_score(pred_LR, label_test)     
得到結果:
0.93200000000000005

我們將結果繪製出來是這樣的:

plot_pic(clf_LR, features_test, label_test)
在這裏插入圖片描述

就這麼簡單的實現了機器學習中邏輯迴歸分類算法。

3 安裝使用

執行安裝

pip install scikit-learn

導入模塊
需要使用什麼算法就import什麼模塊,如果不知道那個算法對應那個庫,這就只能自己記住一些常用的,如果是不常用的,在需要的時候查閱官方文檔就行了。

比如上面例子中,我們要用邏輯迴歸算法,那麼就是,從sklearn的linear_model模塊中導入LogisticRegression算法子模塊。

from sklearn.linear_model import LogisticRegression

4 常用的模塊和函數

scikit-learn有哪些模塊呢,直接看圖吧。
在這裏插入圖片描述
說明:
由圖中,可以看到算法有四類,分類迴歸聚類降維
也就是我在上一篇文章中提到的四個類別。很多模型實際都覆蓋了不同的應用類別。

  • 分類和迴歸是監督式學習,即每個數據對應一個 label。
  • 聚類 是非監督式學習,即沒有 label。
  • 降維,相對比較特殊,是當數據集有很多很多屬性的時候,可以通過 降維 算法把屬性歸納起來。

常用的算法和模塊對應關係
注:以下都是監督學習,無監督學習我們基本用不上,就不列舉了
在這裏插入圖片描述

**注:**每個分類都可能對應了不只一個模型,這裏只列舉了最基本的那個模型,其他可能還有很多變種或擴展。

4、主要流程

下面從機器學習的流程我們來一步步看sklearn提供了什麼的功能支持。

獲取數據 -> 數據預處理 -> 訓練和測試建模 -> 評估模型 -> 保存模型

第一步:獲取數據

要進行數據分析,首先得有數據。sklearn提供了我們兩種方法:

  • 直接導入sklearn小數據集做測試用。
  • 用sklearn提供的接口自己創建數據集。

1.導入sklearn自帶數據集
在這裏插入圖片描述
使用方式:

from sklearn import datasets
iris = datasets.load_iris() # 導入數據集
X = iris.data # 獲得其特徵向量
y = iris.target # 獲得樣本label

2.創建數據集
使用方式:

from sklearn.datasets.samples_generator import make_classification

X, y = make_classification(n_samples=6, n_features=5, n_informative=2, 
    n_redundant=2, n_classes=2, n_clusters_per_class=2, scale=1.0, 
    random_state=20)

#n_samples:指定樣本數,n_features:指定特徵數,
#n_classes:指定幾分類,random_state:隨機種子,使得隨機狀可重

更多內容參看官網文檔
https://scikit-learn.org/stable/datasets/

說明:

在金融數據分析中,我們都是採用股票/期貨等金融數據,有專門的數據獲取渠道,上面這些通過sklearn獲取數據的方式瞭解一下就行了。

第二步:數據預處理

數據預處理階段是很重要的一環,只有預處理後的數據才能被模型或評估器所接受。數據的預處理主要包含這幾個方面的工作:

  • 特徵提取
  • 特徵歸一化
  • 特徵標準化
  • 分割數據集

需要導入的模塊

from sklearn import preprocessing

1.特徵提取
我們獲取的數據中很多數據往往有很多維度,但並不是所有的維度都是有用的,有意義的,所以我們要將對結果影響較小的維度捨去,保留對結果影響較大的維度。PCA(主成分分析)與LDA(線性評價分析)是特徵提取的兩種經典算法。

LDA用法舉例

import sklearn.discriminant_analysis as sk_discriminant_analysis
lda = sk_discriminant_analysis.LinearDiscriminantAnalysis(n_components=2)
lda.fit(iris_X,iris_y)
reduced_X = lda.transform(iris_X) #reduced_X爲降維後的數據
print('LDA:')
print ('LDA的數據中心點:',lda.means_) #中心點
print ('LDA做分類時的正確率:',lda.score(X_test, y_test)) #score是指分類的正確率
print ('LDA降維後特徵空間的類中心:',lda.scalings_) #降維後特徵空間的類中心

2.特徵歸一化
爲了使得訓練數據的標準化規則與測試數據的標準化規則同步,preprocessing中提供了很多Scaler:

data = [[0, 0], [0, 0], [1, 1], [1, 1]]
基於mean和std的標準化

scaler = preprocessing.StandardScaler().fit(train_data)
scaler.transform(train_data)
scaler.transform(test_data)

將每個特徵值歸一化到一個固定範圍

scaler = preprocessing.MinMaxScaler(feature_range=(0, 1)).fit(train_data)
scaler.transform(train_data)
scaler.transform(test_data)
#feature_range: 定義歸一化範圍,注用()括起來

3.特徵標準化
當你想要計算兩個樣本的相似度時必不可少的一個操作,就是正則化。其思想是:首先求出樣本的p-範數,然後該樣本的所有元素都要除以該範數,這樣最終使得每個樣本的範數都爲1。

>>> X = [[ 1., -1.,  2.],
...      [ 2.,  0.,  0.],
...      [ 0.,  1., -1.]]
>>> X_normalized = preprocessing.normalize(X, norm='l2')

>>> X_normalized                                      
array([[ 0.40..., -0.40...,  0.81...],
       [ 1.  ...,  0.  ...,  0.  ...],
       [ 0.  ...,  0.70..., -0.70...]])

4.分割數據集
在得到訓練數據集時,通常我們經常會把訓練數據集進一步拆分成訓練集和驗證集,這樣有助於我們模型參數的選取。
作用:將數據集劃分爲 訓練集和測試集
格式:train_test_split(*arrays, **options)

from sklearn.mode_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

第三步:訓練和測試模型

定義模型
在這一步我們首先要分析自己數據的類型,搞清出你要用什麼模型來做,然後我們就可以在sklearn中定義模型了。使用上幾乎都是同一種模式,只是參數不同。

擬合模型
model.fit(X_train, y_train)

預測模型
model.predict(X_test)

前面例子中已經包含了,這兒再抄一遍。以邏輯迴歸爲例子,如果是其他模型,直接替換相應的名稱就可以了

#導入模型
from sklearn.linear_model import LogisticRegression    #從sklearn中引入邏輯迴歸算法;必背;

#定義了邏輯迴歸的分類器
clf_LR = LogisticRegression()     

#訓練和學習
clf_LR.fit(features_train,label_train)     

 #預測測試集
pred_LR = clf_LR.predict(features_test)    

#拿預測的測試集的label去跟真實的測試集的label去比較、打分
acc = accuracy_score(pred_LR, label_test)     

得到結果:
0.93200000000000005

第四步:評估模型

model.predict(x_test) 返回測試樣本的預測標籤
model.score(predict,label_test) 根據預測值和真實值計算平分

爲模型進行打分

model.score(data_X, data_y)  

score()對不同類型模型評價標準是不一樣的。

  • 迴歸模型:使用“決定係數”評分(coefficient of Determination)
  • 分類模型:使用“準確率”評分(accuracy)

第五步:保存模型

最後,我們可以將我們訓練好的model保存到本地,或者放到線上供用戶使用,那麼如何保存訓練好的model呢?主要有下面兩種方式:
1.讀取pickle文件

import pickle

#保存模型
with open('model.pickle', 'wb') as f:
    pickle.dump(model, f)

#讀取模型
with open('model.pickle', 'rb') as f:
    model = pickle.load(f)
model.predict(X_test)

2.使用joblib模塊

from sklearn.externals import joblib

#保存模型
joblib.dump(model, 'model.pickle')

#載入模型
model = joblib.load('model.pickle')

至此,用sklearn進行機器學習的方法已經介紹完了,下一篇會進行實戰應用

選擇一種模型來對真實的股票數據進行漲跌預測

參考文檔

官方例子
https://scikit-learn.org/stable/auto_examples/index.html
中文文檔
http://sklearn.apachecn.org/#/

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