檔案建立日期: 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 ) 的型別分為:
- 監督式機器學習演算法 ( Supervised machine learning algorithms ) - 訓練資料還標有正確答案。
- 分類 Classification - 具有分類輸出的問題.
- 迴歸 Regression - 具有實際值輸出的問題.
- 如決策樹, 隨機森林, KNN, 邏輯迴歸。
- 無監督式機器學習演算法 ( Unsupervised machine learning algorithms ) - 無監督學習中將沒有正確的答案。
- 群集 ( Clustering ) - 需要資料分組的問題, 如K-means algorithm。
- 關聯 ( Association ) - 需要根據資料大部分的規則找到答案的問題, 如Apriori algorithm。
- 強化式機器學習演算法 ( Reinforcement machine learning algorithms ) - 從過去的經驗中吸取教訓,並嘗試捕獲可能的最佳知識以做出準確的決策。如馬可夫決策過程 ( Markov Decision Process ), Q學習 ( Q Learning ).
最常見的機器學習演算法
- 線性迴歸 ( Linear Regression ) - 基於連續變數估計實際值, 統計和機器學習中最著名的演算法之一
- 簡單線性迴歸 ( Simple linear regression )
- 多元線性迴歸 ( Multiple linear regression )
- 邏輯迴歸 / 對數迴歸 ( Logistic Regression / logit regression ) - 分類演算法
- 決策樹 ( Decision Tree ) - 監督學習演算法,主要用於分類問題
- 支援向量機 ( SVM, Support Vector Machine ) - 分類和迴歸問題
- 樸素貝葉斯 ( Naïve Bayes ) - 一種分類技術
- K最近鄰居 ( KNN, K-Nearest Neighbors ) - 分類和迴歸
- K均值分群 ( K-Means Clustering ) - 無監督的學習, 分群問題
- 隨機森林 ( Random Forest ) - 監督分類演算法, 分類和迴歸類問題
監督式機器學習演算法之分類方法
在分類問題中需要的是分類輸出。 在建立分類模型時,我們需要具有包含資料和相應卷標的訓練資料集。
- 匯入Scikit-learn
- 匯入Scikit-learn的資料集 - 分類卷標名稱/實際卷標/屬性功能名稱/屬性資料
- 將資料整理成陣列 - 將資料分為兩部分,即訓練集和測試集。
- 根據訓練集建立模型
- 以測試集評估模型及其準確性
分類器
- 樸素貝葉斯 ( Naïve Bayes) - 假設預測變數是獨立的。在scikit learn包中有三種Naïve Bayes分類器
- 高斯 Gaussian
- 多項式 Multinomial
- 伯努利 Bernoulli
- 支援向量機 (SVM, Support Vector Machines) - 將每個資料項繪製為n維空間中的一個點,而每個要素的值就是特定坐目標值。
- 邏輯迴歸 ( Logistic Regression ) - 使用Logistic函式估計概率來測量因變數和自變數之間的關係。邏輯函式是sigmoid曲線,用於通過各種引數構建函式。
- 決策樹 ( Decision Tree ) - 二元分類樹流程圖
- 隨機森林 ( Random Forest ) - 將各種機器學習模型組合成更強大的機器學習模型的方法。將各種判定樹組合在一起的方法.
分類器的效能指標
分類效能指標的選擇會影響機器學習演算法的效能測量和比較方式。
- 混淆矩陣 ( Confusion Matrix ) - 混淆矩陣基本上是一個具有"實際"和"預測"兩個維度的表。 這兩個維度均具有'真正' (TP), '真負' (TN), '假正' (FP), '假負' (FN) 。(真假指資料, 正負指預測)
- 準確性 -
Accuracy = (TP+TN)/(TP+TN+FP+FN)
- 精準度 -
Precision = TP/(TP+FP)
- 召回或敏感性 -
Recall = TP/(TP+FN)
- 特異性 -
Specificity = TN/(TN+FP)
分類不平衡的問題 -- 比如億萬富翁人數與一般人的人數差異
解決不平衡問題的方法 - 重新取樣
- 隨機減少多數抽樣法 - 隨機抽取部份多數中的樣品, 再與少量樣品合併.
- 隨機重複少數法 - 隨機抽取少數中的樣品, 重複加到全部的樣品中.
整合/組合方法
從原始資料構造了幾個兩階段分類器,然後彙總它們的預測。
以下是一些示例, 基本的方式都是以下內容, 使用別人建的分類器是很簡單的, 如果自建呢 ? 這已超出我將會在全部檔案所建立的內容.
- 建立資料
- 建立分類器
- 訓練分類器
- 測試分類器
示例 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()
示例 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) # 畫圖
示例 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()
示例 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()