機器學習筆記(持續更新)
分類迴歸的區別
ofollow,noindex" target="_blank">https://www.zhihu.com/question/21329754/answer/18004852
什麼是數值型和標稱型
- 標稱型: 一般在有限的資料中取,而且只存在‘是’和‘否’兩種不同的結果(一般用於分類)
- 數值型: 可以在無限的資料中取,而且數值比較具體化,例如4.02,6.23這種值(一般用於迴歸分析)
kNN k-鄰近演算法
優點:精度高,對異常值不敏感,無資料輸入假定
缺點:計算複雜度高,空間複雜度高
適用資料範圍:數值型和標稱型
實現過程
-
計算已知類別資料集中的點與當前待分類點之間的距離
-
按照距離遞增次序排序
-
選取與當前點距離最小的k個點
-
確定前k個點所在類別的出現概率
-
返回前k個點出現概率最高的類別作為當前點的預測分類
KNN sklearn實現
http://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html
iris = load_iris() clf = neighbors.KNeighborsClassifier(n_neighbors=3) X = iris.data y = iris.target knn = clf.fit(X, y) predict = knn.predict([[4.1, 3.3, 1.4, 0.3]])
關鍵引數:
- n_neighbors 設定K個的個數
決策樹
優點:計算複雜度不高,輸出結果易於理解,對中間值的缺失不敏感,可以處理不相關特徵資料
缺點:可能會產生過度匹配問題
適用資料型別:數值型和標稱型
實現過程
-
特徵選擇:特徵選擇是指從訓練資料中眾多的特徵中選擇一個特徵作為當前節點的分裂標準,如何選擇特徵有著很多不同量化評估標準標準,從而衍生出不同的決策樹演算法。
-
決策樹生成: 根據選擇的特徵評估標準,從上至下遞迴地生成子節點,直到資料集不可分則停止決策樹停止生長。 樹結構來說,遞迴結構是最容易理解的方式。
-
剪枝:決策樹容易過擬合,一般來需要剪枝,縮小樹結構規模、緩解過擬合。剪枝技術有預剪枝和後剪枝兩種。
資訊增益和熵的概念
資訊增益:熵 - 條件熵
條件熵 H(Y|X=長相)= p(X =帥)*H(Y|X=帥)+ p(X =不帥)*H(Y|X=不帥)
決策樹 sklearn實現
http://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html
clf = tree.DecisionTreeClassifier() clf = clf.fit(iris.data, iris.target) with open("iris.dot", 'w') as f: f = tree.export_graphviz(clf, out_file=f)
關鍵引數
參考連結:
樸素貝葉斯
優點:對資料較少情況下仍然有效,可以處理多類別問題
缺點:對於輸入資料的準備方式較為敏感
實際應用
在實際應用中,我們的現象不可能只有一個,比如,在垃圾郵件分類中,甚至可能有幾千個詞的特徵向量。下面,我將引入一些數學上的記號來統一後面的表達:
ωj表示屬於哪個類別,j∈{1,2,3,…,m} xi表示特徵向量中的第i個特徵,i∈{1,2,3,…,n}
樸素貝葉斯的目標就是分別求得P(ωj|給定現象)j∈{1,2,3,…,m},選出最大的概率。
樸素貝葉斯 sklearn實現
http://sklearn.lzjqsdd.com/modules/naive_bayes.html
iris = datasets.load_iris() from sklearn.naive_bayes import GaussianNB nb = GaussianNB() y_pred = gnb.fit(iris.data, iris.target).predict(iris.data)
參考連結:
Logistic迴歸
優點:計算代價不高,易於理解和實現
缺點:容易欠你和,分類精度可能不高
適用資料型別:數值型和標稱型資料
logistic sklearn實現
http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html
import numpy as np from sklearn import linear_model, datasets from sklearn.cross_validation import train_test_split # 1.載入資料 iris = datasets.load_iris() X = iris.data[:, :2]# 使用前兩個特徵 Y = iris.target #np.unique(Y)# out: array([0, 1, 2]) # 2.拆分測試集、訓練集。 X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=0) # 設定隨機數種子,以便比較結果。 # 3.標準化特徵值 from sklearn.preprocessing import StandardScaler sc = StandardScaler() sc.fit(X_train) X_train_std = sc.transform(X_train) X_test_std = sc.transform(X_test) # 4. 訓練邏輯迴歸模型 logreg = linear_model.LogisticRegression(C=1e5) logreg.fit(X_train, Y_train) # 5. 預測 prepro = logreg.predict_proba(X_test_std) acc = logreg.score(X_test_std,Y_test)
關鍵引數:
參考連結:
Logistic迴歸(Logistic Regression)演算法筆記
svm演算法
優點:泛化錯誤率低,計算開銷不大,結果易解釋。
缺點:對引數調節和核函式的選擇敏感,原始分類器不加修改僅適用於處理二類問題。
適用資料型別:數值型和標稱型資料
實現過程
- 尋找最大分類間距
- 轉而通過拉格朗日函式求優化的問題
- 資料可以通過畫一條直線就可以將它們完全分開,這組資料叫線性可分(linearly separable)資料,而這條分隔直線稱為分隔超平面(separating hyperplane)
svm sklearn實現
http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html
from sklearn import datasets from sklearn.cross_validation import train_test_split from sklearn.svm import SVC from numpy import * # download the dataset iris_dataset = datasets.load_iris() iris_data = iris_dataset.data iris_target = iris_dataset.target # split data and target into training set and testing set # 80% training, 20% testing x_train, x_test, y_train, y_test = train_test_split(iris_data, iris_target, test_size = 0.2) # construct SVC by using rbf as kernel function SVC_0 = SVC(C=0.8, kernel='rbf', gamma=20, decision_function_shape='ovr') SVC_0.fit(x_train, y_train) predict = SVC_0.predict(x_test) right = sum(predict == y_test) # accuracy rate print("%f%%" % (right * 100.0 / predict.shape[0]))
關鍵引數
- SVM模型有兩個非常重要的引數C與gamma。其中 C是懲罰係數,即對誤差的寬容度。c越高,說明越不能容忍出現誤差,容易過擬合。C越小,容易欠擬合。C過大或過小,泛化能力變差
- gamma是選擇RBF函式作為kernel後,該函式自帶的一個引數。隱含地決定了資料對映到新的特徵空間後的分佈,gamma越大,支援向量越少,gamma值越小,支援向量越多。支援向量的個數影響訓練與預測的速度。
參考連結
scikit-learn 支援向量機演算法庫使用小結
整合方法
- 投票選舉(bagging: 自舉匯聚法 bootstrap aggregating): 是基於資料隨機重抽樣分類器構造的方法
- 再學習(boosting): 是基於所有分類器的加權求和的方法
目前 bagging 方法最流行的版本是: 隨機森林(random forest)
選男友:美女選擇擇偶物件的時候,會問幾個閨蜜的建議,最後選擇一個綜合得分最高的一個作為男朋友
目前 boosting 方法最流行的版本是: AdaBoost
追女友:3個帥哥追同一個美女,第1個帥哥失敗->(傳授經驗:姓名、家庭情況) 第2個帥哥失敗->(傳授經驗:興趣愛好、性格特點) 第3個帥哥成功
隨機森林原理
那隨機森林具體如何構建呢?
有兩個方面:
- 資料的隨機性化
- 待選特徵的隨機化
優點:幾乎不需要輸入準備、可實現隱式特徵選擇、訓練速度非常快、其他模型很難超越、很難建立一個糟糕的隨機森林模型、大量優秀、免費以及開源的實現。
缺點:劣勢在於模型大小、是個很難去解釋的黑盒子。
適用資料範圍:數值型和標稱型
RF sklearn實現
http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html
from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import make_classification X, y = make_classification(n_samples=1000, n_features=4, n_informative=2, n_redundant=0, random_state=0, shuffle=False) clf = RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini', max_depth=2, max_features='auto', max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=1, oob_score=False, random_state=0, verbose=0, warm_start=False) clf.fit(X, y) print(clf.feature_importances_) print(clf.predict([[0, 0, 0, 0]]))
關鍵引數
- n_estimators: 也就是弱學習器的最大迭代次數,或者說最大的弱學習器的個數。一般來說n_estimators太小,容易欠擬合,n_estimators太大,計算量會太大,並且n_estimators到一定的數量後,再增大n_estimators獲得的模型提升會很小,所以一般選擇一個適中的數值。預設是100
- oob_score :即是否採用袋外樣本來評估模型的好壞。預設識False。個人推薦設定為True,因為袋外分數反應了一個模型擬合後的泛化能力
- criterion: 即CART樹做劃分時對特徵的評價標準。分類模型和迴歸模型的損失函式是不一樣的。分類RF對應的CART分類樹預設是基尼係數gini,另一個可選擇的標準是資訊增益。迴歸RF對應的CART迴歸樹預設是均方差mse,另一個可以選擇的標準是絕對值差mae。一般來說選擇預設的標準就已經很好的。
參考連結
AdaBoost 原理
Boosting演算法的工作機制是首先從訓練集用初始權重訓練出一個弱學習器1,根據弱學習的學習誤差率表現來更新訓練樣本的權重,使得之前弱學習器1學習誤差率高的訓練樣本點的權重變高,使得這些誤差率高的點在後面的弱學習器2中得到更多的重視。然後基於調整權重後的訓練集來訓練弱學習器2.,如此重複進行,直到弱學習器數達到事先指定的數目T,最終將這T個弱學習器通過集合策略進行整合,得到最終的強學習器。
優點:泛化(由具體的、個別的擴大為一般的)錯誤率低,易編碼,可以應用在大部分分類器上,無引數調節。
缺點:對離群點敏感。
適用資料型別:數值型和標稱型資料。
adaboost sklearn實現
http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html
from sklearn.cross_validation import cross_val_score from sklearn.datasets import load_iris from sklearn.ensemble import AdaBoostClassifier iris = load_iris() clf = AdaBoostClassifier(n_estimators=100) scores = cross_val_score(clf, iris.data, iris.target) print scores.mean()