好吧,我標題黨了,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/#/