人工智慧 (02) 機器學習 - 監督式學習分類方法

Jason990420發表於2019-12-18

檔案建立日期: 2019/12/18
最後修訂日期: None
相關軟體資訊:

  • Windows 10
  • Python 3.7.2
  • Numpy 1.17.3
  • sklearn 0.21.3
  • matpltlib 3.1.1

參考檔案: AI with Python Tutorial

說明: 所有內容歡迎引用, 只需註明來源及作者, 本文內容如有錯誤或用詞不當, 敬請指正.

標題: 人工智慧 (02) 機器學習 - 監督式學習分類方法

機器學習 ( ML, Machine Learning ) 的型別分為:

  1. 監督式機器學習演算法 ( Supervised machine learning algorithms ) - 訓練資料還標有正確答案。
    • 分類 Classification - 具有分類輸出的問題.
    • 迴歸 Regression - 具有實際值輸出的問題.
    • 如決策樹, 隨機森林, KNN, 邏輯迴歸。
  2. 無監督式機器學習演算法 ( Unsupervised machine learning algorithms ) - 無監督學習中將沒有正確的答案。
    • 群集 ( Clustering ) - 需要資料分組的問題, 如K-means algorithm。
    • 關聯 ( Association ) - 需要根據資料大部分的規則找到答案的問題, 如Apriori algorithm。
  3. 強化式機器學習演算法 ( Reinforcement machine learning algorithms ) - 從過去的經驗中吸取教訓,並嘗試捕獲可能的最佳知識以做出準確的決策。如馬可夫決策過程 ( Markov Decision Process ), Q學習 ( Q Learning ).

最常見的機器學習演算法

  1. 線性迴歸 ( Linear Regression ) - 基於連續變數估計實際值, 統計和機器學習中最著名的演算法之一
    • 簡單線性迴歸 ( Simple linear regression )
    • 多元線性迴歸 ( Multiple linear regression )
  2. 邏輯迴歸 / 對數迴歸 ( Logistic Regression / logit regression ) - 分類演算法
  3. 決策樹 ( Decision Tree ) - 監督學習演算法,主要用於分類問題
  4. 支援向量機 ( SVM, Support Vector Machine ) - 分類和迴歸問題
  5. 樸素貝葉斯 ( Naïve Bayes ) - 一種分類技術
  6. K最近鄰居 ( KNN, K-Nearest Neighbors ) - 分類和迴歸
  7. K均值分群 ( K-Means Clustering ) - 無監督的學習, 分群問題
  8. 隨機森林 ( Random Forest ) - 監督分類演算法, 分類和迴歸類問題

監督式機器學習演算法之分類方法

在分類問題中需要的是分類輸出。 在建立分類模型時,我們需要具有包含資料和相應卷標的訓練資料集。

  1. 匯入Scikit-learn
  2. 匯入Scikit-learn的資料集 - 分類卷標名稱/實際卷標/屬性功能名稱/屬性資料
  3. 將資料整理成陣列 - 將資料分為兩部分,即訓練集和測試集。
  4. 根據訓練集建立模型
  5. 以測試集評估模型及其準確性

分類器

  1. 樸素貝葉斯 ( Naïve Bayes) - 假設預測變數是獨立的。在scikit learn包中有三種Naïve Bayes分類器
    • 高斯 Gaussian
    • 多項式 Multinomial
    • 伯努利 Bernoulli
  2. 支援向量機 (SVM, Support Vector Machines) - 將每個資料項繪製為n維空間中的一個點,而每個要素的值就是特定坐目標值。
  3. 邏輯迴歸 ( Logistic Regression ) - 使用Logistic函式估計概率來測量因變數和自變數之間的關係。邏輯函式是sigmoid曲線,用於通過各種引數構建函式。
  4. 決策樹 ( Decision Tree ) - 二元分類樹流程圖
  5. 隨機森林 ( Random Forest ) - 將各種機器學習模型組合成更強大的機器學習模型的方法。將各種判定樹組合在一起的方法.

分類器的效能指標

分類效能指標的選擇會影響機器學習演算法的效能測量和比較方式。

  1. 混淆矩陣 ( Confusion Matrix ) - 混淆矩陣基本上是一個具有"實際"和"預測"兩個維度的表。 這兩個維度均具有'真正' (TP), '真負' (TN), '假正' (FP), '假負' (FN) 。(真假指資料, 正負指預測)
  2. 準確性 - Accuracy = (TP+TN)/(TP+TN+FP+FN)
  3. 精準度 - Precision = TP/(TP+FP)
  4. 召回或敏感性 - Recall = TP/(TP+FN)
  5. 特異性 - Specificity = TN/(TN+FP)

分類不平衡的問題 -- 比如億萬富翁人數與一般人的人數差異

解決不平衡問題的方法 - 重新取樣

  1. 隨機減少多數抽樣法 - 隨機抽取部份多數中的樣品, 再與少量樣品合併.
  2. 隨機重複少數法 - 隨機抽取少數中的樣品, 重複加到全部的樣品中.

整合/組合方法

從原始資料構造了幾個兩階段分類器,然後彙總它們的預測。

以下是一些示例, 基本的方式都是以下內容, 使用別人建的分類器是很簡單的, 如果自建呢 ? 這已超出我將會在全部檔案所建立的內容.

  • 建立資料
  • 建立分類器
  • 訓練分類器
  • 測試分類器

示例 1. Naïve Bayes algorithm / GaussianNB

# -----------------------------------------------------------------------------
# Naïve Bayes algorithm - GaussianNB
# -----------------------------------------------------------------------------

import sklearn
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.naive_bayes import GaussianNB
from sklearn.datasets import load_breast_cancer # 腫瘤案例資料載入器

# Dataset of information
data            = load_breast_cancer()          # 載入腫瘤案例
labels          = data['target']                # '惡性', '良性'的資料
label_names     = data['target_names']          # '惡性', '良性' (腫瘤)
features        = data['data']                  # 相關資料
feature_names   = data['feature_names']         # 相關資料標題

train, test, train_labels, test_labels = train_test_split(  # 分割資料
        features,                                           # 60%為訓練組
        labels,                                             # 40%為測試組
        test_size = 0.40,
        random_state = 42)

gnb = GaussianNB()                      # 建立模型訓練
model = gnb.fit(train, train_labels)    # Naïve Bayes algorithm - GaussianNB

preds = gnb.predict(test)                   # 測試組結果與預測對比
score = accuracy_score(test_labels,preds)   # 檢查得分 0.951754.......

示例 2. 支援向量機 (SVM, Support Vector Machines)

# -----------------------------------------------------------------------------
# SVM (Support Vector Machine) classifier
# -----------------------------------------------------------------------------
import numpy as np
import pandas as pd
from sklearn import svm
from sklearn import datasets        # 鳶尾花案例資料載入器
import matplotlib.pyplot as plt

iris = datasets.load_iris()
X = iris.data[:, :2]                # 只取花萼的長度與寛度資料
y = iris.target                     # 花的種類

plt.figure(figsize=(10, 5))
plt.subplot(111)
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 # 畫圖的範圍為
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 # 花瓣和萼片的長度的範圍
h = (x_max / x_min)/100                             # 每邊分100格點
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))

Svc_classifier = svm.SVC(                           # 建立 SVM 分類器並訓練
        kernel='linear',C=1.0,decision_function_shape='ovr').fit(X, y)

X_plot = np.c_[xx.ravel(), yy.ravel()]              # 所有的單位格點作為測試組
Z = Svc_classifier.predict(X_plot)                  # 結果用來畫等高線的高度,
Z = Z.reshape(xx.shape)                             # 因為資料只有三種結果,
plt.contourf(xx,yy,Z,cmap=plt.cm.tab10,alpha=0.3)   # 所以平面就被分成三大區塊
plt.scatter(X[:, 0],X[:, 1],c=y,cmap=plt.cm.Set1)   # 就可清楚看到如何分類
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.xlim(xx.min(), xx.max())
plt.title('SVC with linear kernel')
plt.show()

人工智慧 (02) 機器學習

示例 3. 邏輯迴歸 ( Logistic Regression )

# -----------------------------------------------------------------------------
# Logistic Regression classifier
# -----------------------------------------------------------------------------

import numpy as np
from sklearn import linear_model
import matplotlib.pyplot as plt

X = np.array([[2.0, 4.8], [2.9, 4.7], [2.5, 5.0],       # 建立資料
              [3.2, 5.5], [6.0, 5.0], [7.6, 4.0],
              [3.2, 0.9], [2.9, 1.9], [2.4, 3.5],
              [0.5, 3.4], [1.0, 4.0], [0.9, 5.9]])
y = np.array([0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3])

Classifier_LR = linear_model.LogisticRegression(        # 建立分類器
        multi_class='auto', solver='liblinear', C=75)
Classifier_LR.fit(X, y)                                 # 訓練分類器

def Logistic_visualize(Classifier_LR, X, y):                # 圖形輸出函式
    min_x, max_x = X[:, 0].min() - 1.0, X[:, 0].max() + 1.0 # 所有格點作為輸入
    min_y, max_y = X[:, 1].min() - 1.0, X[:, 1].max() + 1.0 # 輸出代表不同的顏色
    mesh_step_size = 0.02                                   # 因為有四種結果
    x_vals, y_vals = np.meshgrid(                           # 所以平面被分割成
            np.arange(min_x, max_x, mesh_step_size),        # 四塊不同顏色區
            np.arange(min_y, max_y, mesh_step_size))
    output = Classifier_LR.predict(np.c_[x_vals.ravel(), y_vals.ravel()])
    output = output.reshape(x_vals.shape)
    plt.figure()
    plt.pcolormesh(x_vals, y_vals, output, cmap=plt.cm.gray)
    plt.scatter(X[:, 0], X[:, 1], c=y, s=75, edgecolors='black',
            linewidth=1, cmap=plt.cm.Paired)
    plt.xlim(x_vals.min(), x_vals.max())
    plt.ylim(y_vals.min(), y_vals.max())
    plt.xticks((np.arange(int(X[:, 0].min() - 1), int(X[:, 0].max() + 1), 1.0)))
    plt.yticks((np.arange(int(X[:, 1].min() - 1), int(X[:, 1].max() + 1), 1.0)))
    plt.subplots_adjust(top=0.88, bottom=0.11, left=0.12, right=0.9,
            hspace=0.20, wspace=0.20)
    plt.show()

Logistic_visualize(Classifier_LR, X, y)                     # 畫圖

人工智慧 (02) 機器學習

示例 4. 決策樹 ( Decision Tree )

# -----------------------------------------------------------------------------
# Decision Tree Classifier
# -----------------------------------------------------------------------------

import numpy as np
from sklearn import tree
from sklearn.model_selection import train_test_split

X = [[165,19],[175,32],[136,35],[174,65],[141,28],      # [身高, 頭髮長度]
     [176,15],[131,32],[166, 6],[128,32],[179,10],
     [136,34],[186, 2],[126,25],[176,28],[112,38],
     [169, 9],[171,36],[116,25],[196,25]]
Y = ['Man'   ,'Woman' ,'Woman' ,'Man'   ,'Woman',       # 男/女
     'Man'   ,'Woman' ,'Man'   ,'Woman' ,'Man'  ,
     'Woman' ,'Man'   ,'Woman' ,'Woman' ,'Woman',
     'Man'   ,'Woman' ,'Woman' ,'Man']
data_feature_names = ['height','length of hair']

X_train, X_test, Y_train, Y_test = train_test_split(    # 資料分成兩部份
    X, Y, test_size=0.40, random_state=5)               # 60% 訓練集
                                                        # 40% 測試集
clf = tree.DecisionTreeClassifier().fit(X,Y)            # 建立分類器及訓練
prediction = clf.predict([[153,37]])        # 預測高度153, 頭髮長度37 是男是女
print('高153頭髮長37是{}人'.format('男' if prediction[0]=='Man' else '女'))

# 如果執行失敗, 錯誤訊息是 'Graphviz's executables are not found'
# 請安裝 Graphviz 軟體, 並在路徑上加你的安裝路徑+\bin
# 軟體路徑: https://graphviz.gitlab.io/_pages/Download/Download_windows.html
# 不安裝, 可以把下面這段作為批註, 結果不受影響, 下面段看不懂也沒闗系,
# 這段只是用來視覺化而已

import graphviz                                         # 建立流程圖, 存檔為
import pydotplus                                        # Decisiontree16.png
from sklearn.metrics import classification_report
import collections

def tree_visualize():

    dot_data = tree.export_graphviz(
            clf,feature_names=data_feature_names,out_file=None,
            filled=True,rounded=True)
    graph = pydotplus.graph_from_dot_data(dot_data)
    colors = ('orange', 'yellow')
    edges = collections.defaultdict(list)
    for edge in graph.get_edge_list():
        edges[edge.get_source()].append(int(edge.get_destination()))
    for edge in edges:
        edges[edge].sort()
    for i in range(2):
        dest = graph.get_node(str(edges[edge][i]))[0]
    dest.set_fillcolor(colors[i])
    graph.write_png('Decisiontree16.png')
    print('\nFlowchart of tree decision save to Decisiontree16.png')

tree_visualize()

人工智慧 (02) 機器學習

示例 5. 隨機森林 ( Random Forest )

# -----------------------------------------------------------------------------
# Random Forest Classifier
# -----------------------------------------------------------------------------

import numpy as np
from sklearn.datasets import load_breast_cancer         # 腫瘤案例資料載入器
from sklearn.ensemble import RandomForestClassifier
import matplotlib.pyplot as plt

cancer = load_breast_cancer()                           # 載入腫瘤案例
X_train, X_test, y_train, y_test = train_test_split(    # 分為訓練組與測試組
        cancer.data, cancer.target, random_state=0)

forest = RandomForestClassifier(                        # 建立分類器
        n_estimators=50, random_state=0)
forest.fit(X_train,y_train)                             # 訓練分器
score_train = forest.score(X_train,y_train)             # 訓練得分 1.0
score_test  = forest.score(X_test,y_test)               # 測試得分 0.965....

def randomForest_visualize():

    plt.figure(figsize=(10, 5))
    plt.subplot(111)
    n_features = cancer.data.shape[1]                   # 畫出30個特性的重要指數
    plt.barh(range(n_features),forest.feature_importances_)
    plt.yticks(np.arange(n_features),cancer.feature_names)
    plt.tick_params(axis='y', labelsize=12)
    plt.xlabel('Feature Importance')
    plt.ylabel('Feature')
    plt.tight_layout()
    plt.show()

randomForest_visualize()

人工智慧 (02) 機器學習

Jason Yang

相關文章