全文共5835字,預計學習時長16分鐘
機器學習問題一般可以分為三種類型,包括被稱為監督學習的分類和回歸,和無監督學習,無監督學習在機器學習中通常是指聚類。
本文將簡要介紹這三個問題,並在流行的python庫scikit-learn中演練。
在開始之前,先簡要解釋監督和無監督學習術語的含義。
監督學習:在監督學習中,有一組已知的輸入(特徵)和一組已知的輸出(標籤)。一般把輸入特徵和輸出標籤叫做X和y。該算法的目標是學習將輸入映射到輸出的映射函數。從而當給出新的X示例時,該機器可以正確地預測相應的y標籤。
無監督學習:在無監督的學習中,只有一組輸入(X),沒有對應的標籤(y)。該算法的目的是在數據中找到之前未發現的規律。這些算法常常被用來尋找X的類似樣本的有意義的聚類,因此實際上可以找到數據的內在類別。
1. 分類
在分類中,輸出(y)是類別。類別可以只有兩種,比如說可以把郵件分成垃圾郵件和非垃圾郵件。類別也可以有很多種,例如對花的種類進行分類,這被稱為多類分類。
接下來用scikit-learn來舉一個關於分類的簡單例子。如果您尚未安裝scikit-learn,可以通過pip或conda安裝。
Scikit-learn有許多可以通過庫直接訪問的數據集。在本文中為了方便,整個過程中使用的數據集都是這些示例數據集。下面使用屬於多類分類的葡萄酒數據集來說明分類問題。在數據集中,輸入(X)包含13個與每種葡萄酒類型的各種屬性相關的特徵。已知的輸出(y)是數據集中已經給出的用數字0,1或2代表的葡萄酒類型。
本文中使用的所有代碼的導入如下所示。
import pandas as pd
import numpy as npfrom sklearn.datasets import load_wine
from sklearn.datasets import load_bostonfrom sklearn.model_selection importtrain_test_split
from sklearn import preprocessingfrom sklearn.metrics import f1_score
from sklearn.metrics import mean_squared_error
from math import sqrtfrom sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC, LinearSVC, NuSVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier,GradientBoostingClassifier
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis
from sklearn import linear_model
from sklearn.linear_model import ElasticNetCV
from sklearn.svm import SVRfrom sklearn.cluster import KMeans
from yellowbrick.cluster import KElbowVisualizer
from yellowbrick.cluster import SilhouetteVisualizer
在下面的代碼中,下載數據然後把它轉換為pandas數據幀。
wine = load_wine()
wine_df = pd.DataFrame(wine.data, columns=wine.feature_names)
wine_df['TARGET'] = pd.Series(wine.target)
監督學習問題中的下一個步驟是將數據拆分為測試集和訓練集。算法可以使用訓練集來學習輸入和輸出之間的映射,然後使用保留的測試集來評估模型是否學會了這種映射。在下面的代碼中,使用scikit-learnmodel_selection函數train_test_split來執行此操作。
X_w = wine_df.drop(['TARGET'],axis=1)
y_w = wine_df['TARGET']
X_train_w, X_test_w, y_train_w, y_test_w = train_test_split(X_w, y_w,test_size=0.2)
在下一步中,需要選擇最適合學習所選數據集中映射的算法。在scikit-learn有許多不同的算法可供選擇,這些算法使用不同的函數和方法來學習映射,可以在這裡查看完整列表。
運行以下代碼來找出最好的模型。使用一系列算法訓練模型,並獲得每個算法的F1分數。F1分數是衡量分類器整體精度的良好指標。這裡詳細地寫了可以用來評估分類器的各種指標。
classifiers = [
KNeighborsClassifier(3),
SVC(kernel="rbf", C=0.025,probability=True),
NuSVC(probability=True),
DecisionTreeClassifier(),
RandomForestClassifier(),
AdaBoostClassifier(),
GradientBoostingClassifier()
]
for classifier in classifiers:
model = classifier
model.fit(X_train_w, y_train_w)
y_pred_w = model.predict(X_test_w)
print(classifier)
print("model score:%.3f" %f1_score(y_test_w, y_pred_w, average='weighted'))
表示完美的F1得分是1.0,因此,數字越接近1.0,模型性能就越好。上述結果表明,隨機森林分類器(Random Forest Classifier)是此數據集的最佳模型。
2. 回歸
在回歸中,輸出(y)是連續的值,而不是類別。回歸的典型例子是預測商店下個月的銷售額,或者是預測您的房子的未來房價。
為了再次說明回歸,下面將使用scikit-learn稱為波士頓住房數據集的數據集。這個數據集包括13個特徵(X),這些特徵包含房屋的各種屬性,例如房間數量,地點,建築年齡和當地犯罪率。輸出(y)是房價。
使用下面的代碼處理數據,並使用在wine數據集中用的相同方法將其拆分為測試和訓練集。
boston_df =pd.DataFrame(boston.data, columns=boston.feature_names)
boston_df['TARGET'] = pd.Series(boston.target)X_b = boston_df.drop(['TARGET'],axis=1)
y_b = boston_df['TARGET']
X_train_b, X_test_b, y_train_b, y_test_b = train_test_split(X_b, y_b,test_size=0.2)
可以使用這個速查表來查看適用於scikit-learn中回歸問題的可用算法。接下來將使用類似於分類問題的代碼來循環選擇並打出每個分數。
評估回歸模型有許多不同的指標。這些指標本質上都是誤差度量,用來測量由模型實現的實際值和預測值之間的差異。這裡使用了根均值平方誤差(RMSE)。對於此度量,越接近零值則模型的性能越好。本文非常好地解釋了回歸問題的誤差度量。
regressors = [
linear_model.Lasso(alpha=0.1),
linear_model.LinearRegression(),
ElasticNetCV(alphas=None,copy_X=True, cv=5, eps=0.001, fit_intercept=True,
l1_ratio=0.5, max_iter=1000,n_alphas=100, n_jobs=None,
normalize=False, positive=False,precompute='auto', random_state=0,
selection='cyclic', tol=0.0001,verbose=0),
SVR(C=1.0, cache_size=200, coef0=0.0,degree=3, epsilon=0.1,
gamma='auto_deprecated',kernel='rbf', max_iter=-1, shrinking=True,
tol=0.001, verbose=False),
linear_model.Ridge(alpha=.5)
]for regressor in regressors:
model = regressor
model.fit(X_train_b, y_train_b)
y_pred_b = model.predict(X_test_b)
print(regressor)
print("mean squarederror:%.3f" % sqrt(mean_squared_error(y_test_b, y_pred_b)))
RMSE評分表明線性回歸和嶺回歸算法在此數據集中表現性能最佳。
3. 無監督學習
有許多不同類型的無監督學習,但為了簡單起見,下文將重點關注聚類方法。有許多不同的聚類算法,這些算法查找輸入集群的技術都略有不同。
使用最多的方法之一可能是K-means。該算法執行一個迭代過程,從而啟動指定數量的隨機生成裝置。它計算從質心到每個數據點的距離度量,或者說歐氏距離,從而創建有類似值的聚類。每個集群的質心然後成為新的平均值,重複這個過程來找到最佳結果。
接下來使用在分類任務中用過的葡萄酒數據集,去掉y標籤,看看k均值算法是否可以通過輸入識別葡萄酒類型。
因為我們只使用這個模型的輸入,所以我使用稍微不同的方法將數據分解為測試和訓練集。
np.random.seed(0)
msk = np.random.rand(len(X_w)) < 0.8
train_w = X_w[msk]
test_w = X_w[~msk]
由於-Kmeans依賴於距離度量來確定集群,因此在訓練模型之前通常需要執行特徵縮放,確保所有特徵都是相同的大小。下面的代碼使用MinMaxScaler來縮放特徵,確保所有值都在0和1之間。
x = train_w.values
min_max_scaler = preprocessing.MinMaxScaler()
x_scaled = min_max_scaler.fit_transform(x)
X_scaled = pd.DataFrame(x_scaled,columns=train_w.columns)
使用K-means必須指定算法應該使用的集群數量。因此,首先要做的事情之一是確定聚類的最佳數量。這是通過迭代多個k值並在圖表上繪製結果來實現的。這被稱為肘部方法,因為它通常會生成一個看起來有點像肘部的曲線。Yellowbrick庫有一個對於可視化來說非常好的功能。下面的代碼生成此可視化圖像。(註:Yellowbrick庫是一個很好的可視化scikit-learn模型的庫,還可以通過pip安裝)
model = KMeans()
visualizer = KElbowVisualizer(model, k=(1,8))
visualizer.fit(X_scaled)
visualizer.show()
通常在數據集中使用聚類技術的類別有多少是未知的。但在此處,已知的是數據中有三種葡萄酒類型-曲線已經正確選擇了三種葡萄酒作為模型中使用的最佳集群數量。
下一步是初始化K均值算法,並將模型與訓練數據進行擬合,並評估算法對數據進行聚類的有效性。
這裡的一種方法叫做輪廓得分(SilhouetteCoefficient)。這個方法測量集群內值的一致性。換句話說,它測量每個集群中的值彼此的相似程度,以及集群之間的差異程度。為每個值計算輪廓分數,分數的範圍是-1到+1。這些值繪製成輪廓圖。同樣,yellowbrick提供了一種簡單的方法來構建這種輪廓圖。以下代碼用wine數據集生成了此可視化圖。
model = KMeans(3, random_state=42)
visualizer = SilhouetteVisualizer(model,colors='yellowbrick')visualizer.fit(X_scaled)
visualizer.show()
可以通過以下方式解釋剪影圖:
· 平均得分(上面的紅色虛線)越接近+1,則數據點在聚類中匹配得越好。
· 得分為0的數據點非常接近另一個聚類的決策邊界(因此差異度較低)。
· 負值表示數據點可能在錯誤的集群。
· 每個庫的寬度應該是合理均勻的,如果不是這樣的話,那麼使用的可能是錯誤的k值。
上面的葡萄酒數據集的圖表顯示,由於大多數數據點低於平均得分,並且部分數據點低於0,因此集群0可能不如其他集群一致性高。
輪廓分數在比較不同的算法或k值時尤其有用。
這篇文章簡要介紹了三種機器學習類型。所有這些過程還涉及許多其他步驟,包括特徵工程,數據處理和超參數優化,以確定最佳的數據預處理技術和最佳使用模型。
感謝閱讀!
留言點讚關注
我們一起分享AI學習與發展的乾貨
如轉載,請後臺留言,遵守轉載規範