(給演演算法愛好者加星標,修煉程式設計內功)
本文來自「AI演演算法之心」作者何從慶投稿
導讀】眾所周知,Scikit-learn(以前稱為scikits.learn)是一個用於Python程式語言的免費軟體機器學習庫。它具有各種分類,回歸和聚類演演算法,包括支援向量機,隨機森林,梯度增強,k-means和DBSCAN,旨在與Python數值和科學庫NumPy和SciPy互操作。本文將帶你入門常見的機器學習分類演演算法——邏輯回歸、樸素貝葉斯、KNN、SVM、決策樹。
邏輯回歸 (Logistic regression)
邏輯回歸,儘管他的名字包含”回歸”,卻是一個分類而不是回歸的線性模型。邏輯回歸在文獻中也稱為logit回歸,最大熵分類或者對數線性分類器。下麵將先介紹一下sklearn中邏輯回歸的介面:
class sklearn.linear_model.LogisticRegression(penalty='l2', dual=False, tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1, class_weight=None, random_state=None, solver='warn', max_iter=100, multi_class='warn', verbose=0, warm_start=False, n_jobs=None)
常用引數講解:
penalty:懲罰項。一般都是”l1″或者”l2″。
dual:這個引數僅適用於使用liblinear求解器的”l2″懲罰項。 一般當樣本數大於特徵數時,這個引數置為False。
C:正則化強度(較小的值表示更強的正則化),必須是正的浮點數。
solver: 引數求解器。一般的有{‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’}。
multi_class:多分類問題轉化,如果使用”ovr”,則是將多分類問題轉換成多個二分類為題看待;如果使用”multinomial”,損失函式則會是整個機率分佈的多項式擬合損失。
不常用的引數這裡就不再介紹,想要瞭解細節介紹,可以sklearn的官網檢視。
案例:
這裡我使用sklearn內建的資料集——iris資料集,這是一個三分類的問題,下麵我就使用邏輯回歸來對其分類:
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
X, y = load_iris(return_X_y=True)
clf = LogisticRegression(random_state=0, solver='lbfgs',
multi_class='multinomial').fit(X, y)
上面我就訓練好了一個完整的邏輯回歸模型,我們可以用predict這個函式對測試集進行預測。
clf.predict(X[:2, :])
如果想知道預測的機率,可以透過predict_proba這個函式來進行預測。
clf.predict_proba(X[:2, :])
如果想知道我們預測的準確性,可以透過score這個函式來判斷我們的模型好壞。
clf.score(X, y)
樸素貝葉斯
樸素貝葉斯方法是一組基於貝葉斯定理的監督學習演演算法,在給定類變數值的情況下,樸素假設每對特徵之間存在條件獨立性。下麵我將介紹幾種樸素貝葉斯的方法。
1、高斯樸素貝葉斯 (GaussianNB)
高斯樸素貝葉斯的原理可以看這篇文章:http://i.stanford.edu/pub/cstr/reports/cs/tr/79/773/CS-TR-79-773.pdf
這裡,我將介紹如何使用sklearn來實現GaussianNB。
from sklearn import datasets
iris = datasets.load_iris()
from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
y_pred = gnb.fit(iris.data, iris.target).predict(iris.data)
print("Number of mislabeled points out of a total %d points : %d"
% (iris.data.shape[0],(iris.target != y_pred).sum()))
2、多項式樸素貝葉斯 (MultinomialNB/MNB)
這裡我隨機生成一組資料,然後使用MultinomialNB演演算法來學習。
import numpy as np
X = np.random.randint(50, size=(1000, 100))
y = np.random.randint(6, size=(1000))
from sklearn.naive_bayes import MultinomialNB
clf = MultinomialNB()
clf.fit(X, y)
print(clf.predict(X[2:3]))
ComplementNB是標準多項式樸素貝葉斯(MNB)演演算法的一種改進,特別適用於不平衡資料集。具體來說,ComplementNB使用來自每個類的補充的統計資訊來計算模型的權重。CNB的發明者透過實驗結果表明,CNB的引數估計比MNB的引數估計更穩定。此外,在文字分類任務上,CNB通常比MNB表現得更好(通常是相當大的優勢)。
CNB的sklearn介面:
class sklearn.naive_bayes.ComplementNB(alpha=1.0, fit_prior=True, class_prior=None, norm=False)
常用引數講解:
alpha:加性(拉普拉斯/Lidstone)平滑引數(無平滑為0)。
fit_prior:是否學習類先驗機率。若為假,則使用統一先驗。
class_prior :類的先驗機率。如果指定,則不根據資料調整先驗。
norm :是否執行權重的第二次標準化。
案例:
import numpy as np
X = np.random.randint(50, size=(1000, 100))
y = np.random.randint(6, size=(1000))
from sklearn.naive_bayes import ComplementNB
clf = ComplementNB()
clf.fit(X, y)
print(clf.predict(X[2:3]))
BernoulliNB實現了基於多元伯努利分佈的資料的樸素貝葉斯訓練和分類演演算法。BernoulliNB可能在某些資料集上表現得更好,特別是那些檔案較短的資料集。BernoulliNB的sklearn與上面介紹的演演算法介面相似。
案例:
import numpy as np
X = np.random.randint(50, size=(1000, 100))
y = np.random.randint(6, size=(1000))
from sklearn.naive_bayes import BernoulliNB
clf = BernoulliNB()
clf.fit(X, Y)
print(clf.predict(X[2:3]))
K-Nearest Neighbors (KNN)
KNN基於每個查詢點的最近鄰居來實現學習,其中k是使用者指定的一個整數值。是最經典的機器學習演演算法之一。
KNN的skearn的介面如下:
class sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, weights='uniform', algorithm='auto', leaf_size=30, p=2, metric='minkowski', metric_params=None, n_jobs=None, **kwargs)
常用引數講解:
n_neighbors:鄰居數,是KNN中最重要的引數。
algorithm:計算最近鄰的演演算法,常用演演算法有{‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’}。
案例:
from sklearn import datasets
iris = datasets.load_iris()
from sklearn.neighbors import KNeighborsClassifier
neigh = KNeighborsClassifier(n_neighbors=3)
neigh.fit(iris.data, iris.target)
print(neigh.predict((iris.data))
print(neigh.predict_proba((iris.data))
支援向量機 (SVM)
支援向量機(SVMs)是一套用於分類、回歸和異常值檢測的監督學習方法。這裡我將只介紹分類方法。支援向量機的優點是:在高維空間中有效;在維數大於樣本數的情況下仍然有效,因此對於小資料集,SVM可以表現出良好的效能。
SVM在sklearn上有三個介面,分別是 LinearSVC, SVC, 和 NuSVC。最常用的一般是SVC介面。
SVC的sklearn介面:
class sklearn.svm.SVC(C=1.0, kernel=’rbf’, degree=3, gamma=’auto_deprecated’, coef0=0.0, shrinking=True, probability=False, tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, decision_function_shape=’ovr’, random_state=None)
常用引數講解:
C : 錯誤項的懲罰引數C
kernel:核函式的選擇。常用的核函式有:‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’。
probability :預測時是否使用機率估計。
案例:
import numpy as np
X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
y = np.array([1, 1, 2, 2])
from sklearn.svm import SVC
clf = SVC(C=1,kernel='rbf',gamma='auto')
clf.fit(X, y)
print(clf.predict([[-0.8, -1]]))
拓展:SVM解決二分類問題具有得天獨厚的優勢,然而對於解決多分類問題卻很困難。常見的解決方案是“一對一”的方法解決多分類問題。具體地,假設 這個是一個 n_class的分類問題,則會構建 n_class*(n_class-1)/2個二分類,來解決這個多分類問題。
X = [[0], [1], [2], [3]]
Y = [0, 1, 2, 3]
clf = svm.SVC(gamma='scale', decision_function_shape='ovo')
clf.fit(X, Y)
dec = clf.decision_function([[1]])
dec.shape[1] # 4 classes: 4*3/2 = 6
clf.decision_function_shape = "ovr"
dec = clf.decision_function([[1]])
dec.shape[1] # 4 classes
決策樹
決策樹作為十大經典演演算法之一,能夠很好的處理多分類問題。
決策樹的sklearn介面:
class sklearn.tree.DecisionTreeClassifier(criterion=’gini’, splitter=’best’, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, class_weight=None, presort=False)
常用引數講解:
criterion:該函式用於衡量分割的依據。常見的有”gini”用來計算基尼繫數和”entropy”用來計算資訊增益。
max_depth:樹的最大深度。
min_samples_split:分割內部節點所需的最小樣本數。
min_samples_leaf:葉節點上所需的最小樣本數。
案例:
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier(random_state=0)
iris = load_iris()
clf.fit(iris.data, iris.target)
clf.predict(iris.data)
clf.predict_proba(iris.data)
總結
本文介紹了幾種常見的機器學習分類演演算法,如邏輯回歸,樸素貝葉斯,KNN,SVM,以及決策樹演演算法。同時,也用sklearn的python介面展示了各個演演算法使用案例。小夥伴們是否學會了呢?