機器學習系列(一)——理論基礎
機器學習是一個計算機程式,針對某個特定的任務,從經驗(即資料,誰的資料規模大、質量好,誰就佔據了機器學習個人工智慧領域最有利的資本。)中學習,並且越做越好。
機器學習工具
庫:numpy、pandas、scikit-learn、matplotlib 開發環境:Anaconda、Pycharm scikit-learn包含了幾乎所有主流的機器學習演算法,提供了一致的呼叫介面。詳情可以參考官網文件:http://scikit-learn.org
機器學習流程
-
資料採集和標註
-
資料預處理 缺失值、異常值和重複值的處理,將不適合進入機器學習模型的資料處理掉。缺失值、異常值和重複值的處理,將不適合進入機器學習模型的資料處理掉。
-
特徵選擇 基於業務背景人工選擇特徵、基於模型自動選擇特徵。
-
模型選擇 scikit-learn官網提供了一個模型速查表,針對幾個簡單問題就可以選擇一個相對合適的模型。
-
模型訓練與測試 模型訓練需要把資料集分成訓練集和測試集,訓練集建模,測試集評價模型準確性。
#切分資料
from sklearn.cross_validation import train_test_split
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=2)
#建立模型,訓練
from sklearn import svm
clf = svm.SVC(C=1.0, kernel='rbf', gamma=0.5)
clf.fit(x_train, y_train)
#模型測試
clf.score(x_train, y_train)
clf.score(x_test, y_test)
- 模型評價與優化 從眾多的模型中選擇一個合適的模型去擬合數據,然後從這個選定模型的眾多引數中,選擇適合的引數,使得成本函式最小。
- 模型儲存與使用 對模型滿意後,就可以把模型儲存下來,下次使用時可以直接載入模型,不需要重新訓練。
#儲存模型
from sklearn.externals import joblib
joblib.dump(clf, 'svm.pkl')
#載入模型
clf = joblib.load('svm.pkl')
y_pred = clf.predict(x_test)
## 過擬合、欠擬合
-
過擬合 過擬合(over fitting),也稱高方差(high variance),指模型能較好地擬合訓練樣本,但對於新資料的預測準確性很差。 處理方法:增加樣本量、減少輸入的特徵數量。
-
欠擬合 欠擬合(under fitting),也稱高偏差(high bias),指模型不能很好地擬合訓練樣本,對於新資料的預測準確性也不好。 處理方法:欠擬合說明模型過於簡單,可以增加有價值的特徵使模型複雜些。
學習曲線
以模型在訓練集train和交叉驗證資料集validation上的準確率為縱座標,畫出與訓練集樣本量m的大小關係,這就是學習曲線。學習曲線可以看出,隨著樣本量的增加,模型對訓練集擬合的準確性以及對交叉驗證資料集預測的準確性的變化規律。
#學習曲線繪製
from sklearn.svm import LinearSVC
from sklearn.learning_curve import learning_curve
#繪製學習曲線,以確定模型的狀況
def plot_learning_curve(estimator, title, X, y, ylim=None, cv=None,
train_sizes=np.linspace(.1, 1.0, 5)):
"""
畫出data在某模型上的learning curve.
引數解釋
----------
estimator : 你用的分類器。
title : 表格的標題。
X : 輸入的feature,numpy型別
y : 輸入的target vector
ylim : tuple格式的(ymin, ymax), 設定影象中縱座標的最低點和最高點
cv : 做cross-validation的時候,資料分成的份數,其中一份作為cv集,其餘n-1份作為training(預設為3份)
train_sizes=np.linspace(0.1, 1.0, 5) :表示把樣本數量從0.1~1.0分成5等份,然後逐個計算每個等份樣本量下模型準確性。
"""
plt.figure()
train_sizes, train_scores, test_scores = learning_curve(
estimator, X, y, cv=5, n_jobs=1, train_sizes=train_sizes)
train_scores_mean = np.mean(train_scores, axis=1)
train_scores_std = np.std(train_scores, axis=1)
test_scores_mean = np.mean(test_scores, axis=1)
test_scores_std = np.std(test_scores, axis=1)
plt.fill_between(train_sizes, train_scores_mean - train_scores_std,
train_scores_mean + train_scores_std, alpha=0.1,
color="r")
plt.fill_between(train_sizes, test_scores_mean - test_scores_std,
test_scores_mean + test_scores_std, alpha=0.1, color="g")
plt.plot(train_sizes, train_scores_mean, 'o-', color="r",
label="Training score")
plt.plot(train_sizes, test_scores_mean, 'o-', color="g",
label="Cross-validation score")
plt.xlabel("Training examples")
plt.ylabel("Score")
plt.legend(loc="best")
plt.grid("on")
if ylim:
plt.ylim(ylim)
plt.title(title)
plt.show()
#少樣本的情況情況下繪出學習曲線
plot_learning_curve(LinearSVC(C=10.0), "LinearSVC(C=10.0)",
X, y, ylim=(0.8, 1.01),
train_sizes=np.linspace(.05, 0.2, 5))
## 查準率、召回率
有時候,不能單靠模型的準確性去衡量模型的好壞。在scikit-learn中,可以使用查準率和召回率評估模型效能,即sklearn.metrics.precision_score()和sklearn.metrics.recall_score()。
TP: 實際是正樣本, 被識別成正樣本(識別正確).
FP: 實際是負樣本, 被識別成正樣本(識別錯誤).
FN: 實際是正樣本, 被識別為負樣本(識別正確).
TN: 實際是負樣本, 被識別為正樣本(識別錯誤).
查準率和召回率定義如下:
Precision = TP/(TP+FP); 查準率, 在所有被判斷為正樣本中, 真正正樣本的數量.
Recall = TP/(TP+FN); 召回率, 在所有正樣本中, 被識別為正樣本的數量.
綜合指標F1 score定義:
F = 2PR/(P+R)
scikit-learn中,計算F1 score的函式是sklearn.metrics.f1_score()。