機器學習神器 Scikit-Learn 入門教程

Scikit-learn 是一個非常知名的 Python 機器學習庫,它廣泛地用於統計分析和機器學習建模等數據科學領域。

本篇文章通過簡明快要的方式來介紹 scikit-learn 的使用,更多詳細內容請參考官網:

  1. 內置數據集使用

  2. 數據集切分

  3. 數據歸一化和標準化

  4. 類型編碼

  5. 建模 6 步曲

Scikit-learn 使用神圖

下面這張圖是官網提供的,從樣本量的大小開始,分爲迴歸、分類、聚類、數據降維共 4 個方面總結了 scikit-learn 的使用:

https://scikit-learn.org/stable/tutorial/machine_learning_map/index.html

安裝

關於安裝 scikit-learn,建議通過使用 anaconda 來進行安裝,不用擔心各種配置和環境問題。當然也可以直接 pip 來安裝:

pip install scikit-learn

數據集生成

sklearn 內置了一些優秀的數據集,比如:Iris 數據、房價數據、泰坦尼克數據等。

import pandas as pd
import numpy as np

import sklearn 
from sklearn import datasets  # 導入數據集

分類數據 - iris 數據

# iris數據
iris = datasets.load_iris()
type(iris)

sklearn.utils.Bunch

iris 數據到底是什麼樣子?每個內置的數據都存在很多的信息

可以將上面的數據生成我們想看到的 DataFrame,還可以添加因變量:

迴歸數據 - 波士頓房價

我們重點關注的屬性:

同樣可以生成 DataFrame:

三種方式生成數據

方式 1

#調用模塊
from sklearn.datasets import load_iris
data = load_iris()

#導入數據和標籤
data_X = data.data
data_y = data.target

方式 2

from sklearn import datasets
loaded_data = datasets.load_iris()  # 導入數據集的屬性

#導入樣本數據
data_X = loaded_data.data
# 導入標籤
data_y = loaded_data.target

方式 3

# 直接返回
data_X, data_y = load_iris(return_X_y=True)

數據集使用匯總

from sklearn import datasets  # 導入庫

boston = datasets.load_boston()  # 導入波士頓房價數據
print(boston.keys())  # 查看鍵(屬性)     ['data','target','feature_names','DESCR', 'filename'] 
print(boston.data.shape,boston.target.shape)  # 查看數據的形狀 
print(boston.feature_names)  # 查看有哪些特徵 
print(boston.DESCR)  # described 數據集描述信息 
print(boston.filename)  # 文件路徑

數據切分

# 導入模塊
from sklearn.model_selection import train_test_split
# 劃分爲訓練集和測試集數據
X_train, X_test, y_train, y_test = train_test_split(
  data_X, 
  data_y, 
  test_size=0.2,
  random_state=111
)

# 150*0.8=120
len(X_train)

數據標準化和歸一化

from sklearn.preprocessing import StandardScaler  # 標準化
from sklearn.preprocessing import MinMaxScaler  # 歸一化

# 標準化
ss = StandardScaler()
X_scaled = ss.fit_transform(X_train)  # 傳入待標準化的數據

# 歸一化
mm = MinMaxScaler()
X_scaled = mm.fit_transform(X_train)

類型編碼

來自官網案例:https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html

對數字編碼

對字符串編碼

建模案例

導入模塊

from sklearn.neighbors import KNeighborsClassifier, NeighborhoodComponentsAnalysis  # 模型
from sklearn.datasets import load_iris  # 導入數據
from sklearn.model_selection import train_test_split  # 切分數據
from sklearn.model_selection import GridSearchCV  # 網格搜索
from sklearn.pipeline import Pipeline  # 流水線管道操作

from sklearn.metrics import accuracy_score  # 得分驗證

模型實例化

# 模型實例化
knn = KNeighborsClassifier(n_neighbors=5)

訓練模型

knn.fit(X_train, y_train)
KNeighborsClassifier()

測試集預測

y_pred = knn.predict(X_test)
y_pred  # 基於模型的預測值
array([0, 0, 2, 2, 1, 0, 0, 2, 2, 1, 2, 0, 1, 2, 2, 0, 2, 1, 0, 2, 1, 2,
       1, 1, 2, 0, 0, 2, 0, 2])

得分驗證

模型得分驗證的兩種方式:

knn.score(X_test,y_test)
0.9333333333333333
accuracy_score(y_pred,y_test)
0.9333333333333333

網格搜索

如何搜索參數

from sklearn.model_selection import GridSearchCV

# 搜索的參數
knn_paras = {"n_neighbors":[1,3,5,7]}
# 默認的模型
knn_grid = KNeighborsClassifier()

# 網格搜索的實例化對象
grid_search = GridSearchCV(
 knn_grid, 
 knn_paras, 
 cv=10  # 10折交叉驗證
)
grid_search.fit(X_train, y_train)
GridSearchCV(cv=10, estimator=KNeighborsClassifier(),
             param_grid={'n_neighbors'[1, 3, 5, 7]})
# 通過搜索找到的最好參數值
grid_search.best_estimator_
KNeighborsClassifier(n_neighbors=7)
grid_search.best_params_

Out[42]:

{'n_neighbors': 7}
grid_search.best_score_
0.975

基於搜索結果建模

knn1 = KNeighborsClassifier(n_neighbors=7)

knn1.fit(X_train, y_train)
KNeighborsClassifier(n_neighbors=7)

通過下面的結果可以看到:網格搜索之後的建模效果是優於未使用網格搜索的模型:

y_pred_1 = knn1.predict(X_test)

knn1.score(X_test,y_test)
1.0
accuracy_score(y_pred_1,y_test)
1.0
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/l5Qgb_NvCnvalJFVT1MHGw