Python筆記(機器學習)(二)—— 理論

環境部署

Scikit-learn

Python語言中專門針對機器學習應用而發展起來的一款開源框架(算法庫),可以實現數據預處理、分類、迴歸、降維、模型選擇等常用的機器學習算法

特點:集成了機器學習中各類成熟的算法,容易安裝和使用,樣例豐富,教程和文檔也非常詳細

不支持Python之外的語言,不支持深度學習和強化學習

安裝:https://scikit-learn.org/stable/install.html

數據預處理

Iris數據集:

Iris鳶尾花數據集是一個經典數據集,在統計學習和機器學習領域都經常被用作示例,屬於監督式學習;

數據集分3類共150條記錄,每類各50個數據

每條記錄都有4項特徵:花萼長度(Sepal Length)、花萼寬度(Sepal Width)、花瓣長度(Petal Length)、花瓣寬度(Petal Width)

通過這4個特徵預測鳶尾花卉屬於(iris-setosa、iris-versicolour、iris-virginica)中的哪一品種。

操作步驟:

iris數據加載

# coding:utf-8
# iris數據加載
from sklearn import datasets

iris = datasets.load_iris()
# 每行數據爲一個樣本
# 每列數據代表不同樣本同一屬性下對應的數值
print iris.data

# 打印iris數據單位
print iris.feature_names

結果:

[[5.1 3.5 1.4 0.2]
[4.9 3. 1.4 0.2]
[4.7 3.2 1.3 0.2]
[4.6 3.1 1.5 0.2]
[5. 3.6 1.4 0.2]

[6.7 3. 5.2 2.3]
[6.3 2.5 5. 1.9]
[6.5 3. 5.2 2. ]
[6.2 3.4 5.4 2.3]
[5.9 3. 5.1 1.8]]
[‘sepal length (cm)’, ‘sepal width (cm)’, ‘petal length (cm)’, ‘petal width (cm)’]

數據展示

# 輸出的結果
print iris.target

# 結果的含義
print iris.target_names

結果:

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2]
[‘setosa’ ‘versicolor’ ‘virginica’]

確認數據維度

# 確認數據類型
print type(iris.data)
print type(iris.target)

# 確認維度
print iris.data.shape
print iris.target.shape

結果:

<type ‘numpy.ndarray’>
<type ‘numpy.ndarray’>
(150, 4)
(150,)

使用scikit-learn進行數據處理的四個關鍵點

1.區分開屬性數據與結果數據

2.屬性數據與結果數據都是量化

3.運算過程中,屬性數據與結果數據的類型都是NumPy數組

4.屬性數據與結果數據的維度是對應

模型訓練

分類:根據數據集目標的特徵或屬性,劃分到已有的類別中

常用的分類算法:K近鄰(KNN)、邏輯迴歸、決策樹、樸素貝葉斯

K近鄰分類模型(KNN):

給定一個訓練數據集,對新的輸入實例,在訓練數據集中找到與該實例最鄰近
的K個實例(也就是上面所說的K個鄰居),這K個實例的多數屬於某個類,就
把該輸入實例分類到這個類中,最簡單的機器學習算法之一

模型訓練:

選用KNN模型

# coding:utf-8
# iris數據加載
from sklearn import datasets

iris = datasets.load_iris()

# X輸入數據賦值;y輸出數據賦值
X = iris.data
y = iris.target

# 確認樣本與輸出數據維度
print X.shape
print y.shape

# 模型調用
from sklearn.neighbors import KNeighborsClassifier

# 創建模型實例
knn1 = KNeighborsClassifier(n_neighbors=1)
# 查看knn是什麼
print knn1

# 模型訓練
knn1.fit(X, y)

結果:

(150, 4)
(150,)
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
           metric_params=None, n_jobs=None, n_neighbors=1, p=2,
           weights='uniform')

根據模型預測

# 使用模型預測,要對應訓練數據類型
X1 = [[1, 2, 3, 4], [2, 4, 1, 2]]
y1 = knn1.predict(X1)
# 查看預測結果
print y1

# 創建不同模型實例訓練
knn5 = KNeighborsClassifier(n_neighbors=5)
# 模型訓練
knn5.fit(X, y)
# 使用新的模型預測
y2 = knn5.predict(X1)
# 查看預測結果
print y2

結果:

[2 0]
[1 0]

模型評估

選擇合適的模型方法

評估流程:

使用準確率的方式評估:可以方便的用於衡量模型的整體預測效果,但無法反映細節信息,具體表現在:
1.沒有體現數據的實際分佈情況
2.沒有體現模型錯誤預測的類型
空準確率:當模型總是預測比例較高的類別,其預測準確率的數值
將整個數據集用於訓練和測試:

訓練數據與測試數據相同導致的問題:

  • 訓練模型的最終目標是爲了預測新數據對應的結果
  • 最大化訓練準確率通常會導致模型複雜化(比如增加維度),因此將降低模型的通用性
  • 過度複雜模型容易導致訓練數據的過度擬合
分離訓練數據和測試數據:

分離訓練集與測試集數據的作用:

  • 可以實現在不同的數據集上進行模型訓練與預測
  • 建立數學模型的目的是對新數據的預測,基於測試數據計算的準確率能更有效的評估模型的表現

模型關鍵參數(K)選擇

目標:

確定合適的參數(組),提高模型預測準確率

方法:

1.遍歷參數組合,建立對應的模型

2.使用訓練集數據進行模型訓練

3.使用測試集數據進行預測,評估每個模型的表現

4.通過圖形展示參數(組)與準確率的關係,確定合適的參數(組)

# 用knn5模型預測訓練數據,獲取準確率
y3 = knn5.predict(X)
# 同時用knn1模型預測訓練數據,獲取準確率
y4 = knn1.predict(X)

# 準確率
from sklearn.metrics import accuracy_score

print accuracy_score(y, y3)
print accuracy_score(y, y4)

結果:

0.9666666666666667
1.0

訓練數據和測試數據分離:

# 數據分離
from sklearn.model_selection import train_test_split

# 40%數據用來測試
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4)
# 分離後數據集的維度確認
print X_train.shape, X_test.shape, y_train.shape, y_test.shape

結果:

(90, 4) (60, 4) (90,) (60,)

# 分離後數據集的訓練與評估
knn5.fit(X_train, y_train)
y_train_pred = knn5.predict(X_train)
y_test_pred = knn5.predict(X_test)

print accuracy_score(y_train, y_train_pred)
print accuracy_score(y_test, y_test_pred)

結果(多次執行結果不同):

0.9666666666666667
0.9166666666666666

如何確定合適的K值:

KNeighborsClassifier(n_neighbors=K值),k值越小,模型越複雜

# k:1-25
# 遍歷所有可能的參數組合
# 建立相應的model
# model訓練 預測
# 給予測試數據的準確率計算
# 查看最高的準確率對應的k值
k_range = list(range(1, 26))
print k_range

score_train = []
score_test = []
for k in k_range:
    knn_temp = KNeighborsClassifier(n_neighbors=k)
    knn_temp.fit(X_train, y_train)
    y_train_pred = knn_temp.predict(X_train)
    y_test_pred = knn_temp.predict(X_test)
    score_train.append(accuracy_score(y_train, y_train_pred))
    score_test.append(accuracy_score(y_test, y_test_pred))

for k in k_range:
    print k, score_train[k - 1]

for k in k_range:
    print k, score_test[k - 1]

結果(多次執行結果不同):

1 1.0
2 0.9888888888888889
3 0.9777777777777777
4 0.9777777777777777
5 0.9777777777777777
6 0.9888888888888889
7 0.9777777777777777
8 0.9777777777777777
9 0.9777777777777777
10 0.9777777777777777
11 0.9777777777777777
12 0.9888888888888889
13 0.9777777777777777
14 0.9888888888888889
15 0.9666666666666667
16 0.9777777777777777
17 0.9666666666666667
18 0.9666666666666667
19 0.9666666666666667
20 0.9666666666666667
21 0.9666666666666667
22 0.9666666666666667
23 0.9666666666666667
24 0.9666666666666667
25 0.9666666666666667

1 0.9166666666666666
2 0.9333333333333333
3 0.9333333333333333
4 0.9166666666666666
5 0.9666666666666667
6 0.9333333333333333
7 0.9333333333333333
8 0.9333333333333333
9 0.9166666666666666
10 0.9333333333333333
11 0.9166666666666666
12 0.9333333333333333
13 0.9333333333333333
14 0.9333333333333333
15 0.9333333333333333
16 0.9166666666666666
17 0.9333333333333333
18 0.9
19 0.9333333333333333
20 0.8833333333333333
21 0.8833333333333333
22 0.8833333333333333
23 0.8833333333333333
24 0.8833333333333333
25 0.8833333333333333

利用繪圖工具輔助分析:

# 圖形展示
# 導入Matplotlib圖庫並使圖像在notebook中展示
import matplotlib.pyplot as plt
# %matplotlib inline

# 展示k值與訓練數據集預測準確率之間的關係
plt.plot(k_range, score_train)
plt.xlabel('K(KNN model)')
plt.ylabel('Training Accuracy')

# 展示k值與訓練數據集預測準確率之間的關係
plt.plot(k_range, score_test)
plt.xlabel('K(KNN model)')
plt.ylabel('Training Accuracy')
# 解決pycharm不顯示圖表問題
plt.show()

其他模型:

邏輯迴歸模型:

用於解決分類問題的一種模型。根據數據特徵或屬性,計算其歸屬於某一類別的概率P(x),根據概率數值判斷其所屬類別,主要應用場景,二分類問題。

模型評估方式說明

混淆矩陣:

混淆矩陣,又稱爲誤差矩陣,用於衡量分類算法的準確程度

.True Positives (TP):預測準確、實際爲正樣本的數量(實際爲1 ,預測爲1 )
.True Negatives (TN):預測準確、實際爲負樣本的數量(實際爲0 ,預測爲0 )
.False Positives (FP): 預測錯誤、實際爲負樣本的數量(實際爲0 ,預測爲1 )
.False Negatives (FN):預測錯誤、實際爲正樣本的數量(實際爲1 ,預測爲0 )

特點:

分類任務中,相比單一的預測準確率,混淆矩陣提供了更全面的模型評估信息

通過混淆矩陣,我們可以計算出多樣的模型表現衡量指標,從而更好的選擇模型

指標:

準確率(Accuracy):整體樣本中,預測正確的比例

錯誤率(Misclassification Rate):整體樣本中,預測錯誤的比例

召回率(Recall):正樣本中,預測正確的比例

特異度(Specificity):負樣本中,預測正確的比例

精確率(Precision):預測結果爲正樣本中,預測正確的比例

F1分數(F1 Score):綜合Precision和Recall的判斷指標

哪個衡量指標更關鍵:

衡量指標的選擇取決於應用場景

問題排查:

1.pip install scikit-learn時:
pip._vendor.urllib3.exceptions.ReadTimeoutError
更換鏡像或設置超時時間:
更換鏡像:
pip install -i http://mirrors.aliyun.com/pypi/simple/
pip install -i http://pypi.douban.com/simple/
設置超時時間(更換鏡像無果,選擇了設置超時,耗時半天。。。):
pip --default-timeout=100 install scikit-learn

2.pip install matplotlib時:
pip --default-timeout=100 install matplotlib

3.%matplotlib inline一直報錯:
https://www.jianshu.com/p/2dda5bb8ce7d

4.報錯解決卻不能顯示
增加plt.show()


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