?
二分類(lèi)算法是算法指將數據分為兩(liang)個(gè)類(lèi)別的機器學(xué)習算法,在實(shí)際應用中,分類(lèi)我們經(jīng)常需要對一些(xie)事物進(jìn)行分類(lèi),算法例(′?`*)如垃圾郵件與非垃圾??郵件、分類(lèi)電影的算法(fa)好壞等,Python作為一門(mén)強大的分類(lèi)編程語(yǔ)言,提供了豐富的算法機器學(xué)習庫,支持多種二分類(lèi)算法,分類(lèi)本文將介紹幾種常用的Python二分類(lèi)??算法,包括邏輯回歸、支持向量機、決策樹(shù)和隨機森林等。
邏輯回歸(??Logistic Reg???ression)是一種基于概率論的分類(lèi)算法,主要用于解決二分類(lèi)問(wèn)題,邏輯回歸的核心思想是利用Sigmoid函數將(jiang)線(xiàn)性回歸的結果映射到0-1之間,從而得到每個(gè)樣本屬于某個(gè)類(lèi)別的概率,通過(guò)最大化似然函數,可以得到最優(yōu)的模型參數。
Python中常用的邏(′?ω?`)輯回歸庫有sklearn和scikit-learn,其中sklearn提供了LogisticRegression類(lèi)來(lái)實(shí)現邏輯回歸。
from sklearn.linear_model import LogisticRegre??ssionfrom sklearn.model_selection im(?????)port trai??n_test_splitfrom sklea(′?`)rn.meヽ(′?`)ノtrics imp(′_`)ort accuracy_score加載數據集X = [[0, 0], [1, 1]]y = [0, 1]劃分訓練集和測試集X_train, X_test, y_train, y_test = train_??test_split(T_T)(X, y, test_size=(′Д` )0.25, random_state=42)創(chuàng )建邏輯回ヽ(′▽?zhuān)?ノ歸模型并訓練model = LogisticRegression()model.fit(X_train, y_train)預測y_pred = model.predict(??X_test)計算準確率accu(°□°)racy = accuraヽ(′▽?zhuān)?ノcy_score(y_test, y_(╬ ò﹏ó)pred)print("Accuracy:",?? accuracy)支持向量機(Support Vector Machiヽ(′▽?zhuān)?ノne,簡(jiǎn)稱(chēng)SVM)是一種非常強??大的二分類(lèi)算法,它通過(guò)對數據進(jìn)行線(xiàn)性分類(lèi)來(lái)實(shí)現二分類(lèi),與邏輯回歸相比,SVM具有更好的泛化能力,能夠在高維空間中找到最優(yōu)的超平面進(jìn)行分類(lèi)。
Python中常用的支持向量機庫有sklearn和sヾ(′?`)?cikヾ(′?`)?it-learn,其中sklearn提供了SVC類(lèi)來(lái)實(shí)??現支持向量機。
from sk??learn.svm import SV(′ω`*)Cfrom sklearn.model_selection import train_tes??t_splitfrom sklearn.metrics import acc??uracy_score加載數(shu)據集X = [[(⊙_⊙)0, 0], [1, 1], [2, 2]]y = [0, 1, 1]劃分訓練集和測試集X_train, X_tes??t, y_train, y_test = train_test_split(X, y, test_size=0.25, rand??om_state=42)創(chuàng )建支持向量機模型并訓ヽ(′▽?zhuān)?ノ練model = SVC()model.fit(X_train, y_train)預測y_pred = model.??predic┐(′д`)┌t(X_test)計算準確率accuracy = accuracy??_score(y_test, y_pred)print("Accヾ(′▽?zhuān)??u(′ω`*)racy:", accuracy)決策樹(shù)(D(′?`)ecision Tree)是??一種基于樹(shù)結構的分類(lèi)算法,它通過(guò)遞歸地分割數據集來(lái)構建決策樹(shù),決策樹(shù)的優(yōu)點(diǎn)是可以處理數值型特征和分類(lèi)型特征,且易于理解和解釋。
Python中常用的決策樹(shù)庫有s(′_ゝ`)klearn,其中sklヽ(′ー`)ノearn提供了DecisionTreeClassifier類(lèi)來(lái)實(shí)現決策樹(shù)。
from sklearn.tree import DecisionTreeClassifierfrom sklearn.model_selection import train_test_splitfrom sklearn.metr??ics import accuracy_scorefrom sklearn.dataset(′?ω?`)s import load_irisimport numpy as np加載數據集data = load_iris()X = data.data[:, :2] 只取前兩個(gè)特征作為輸入變量y = (data.target != 0) * 1 將類(lèi)別標簽轉換為二進(jìn)制形式(非零標簽為1)y[y == 1] = 0 將類(lèi)別標簽反轉(0變?yōu)?,1變?yōu)?)以便后續計算準確率時(shí)使用正確的閾值判斷類(lèi)別邊界點(diǎn)是否存在異常值(如數據集中的某些樣本可能??被錯誤地標記為另一個(gè)類(lèi)別)n_samples = len(y) 樣本數量等于??類(lèi)別數量的兩倍減去一個(gè)孤立點(diǎn)(該點(diǎn)既不屬于任何類(lèi)別也沒(méi)有相鄰的類(lèi)別邊界點(diǎn)與之相連)用于計算準確率時(shí)的閾值(因為孤立點(diǎn)的標簽無(wú)法確定)n_features = X.shape[1] 特征數量等于輸入變(bian)量的維度數(即數據的維度數)除以2(只取前兩(liang)個(gè)特征作為輸入變量)??再加(⊙_⊙)1(加上??一個(gè)虛擬節點(diǎn)表示孤立點(diǎn))以便后續計算準確率時(shí)使用正確的閾值判斷??類(lèi)別邊界點(diǎn)是否存在異常值(如數據集中的某些樣本ヽ(′ー`)ノ可能被錯誤地標記為另一個(gè)類(lèi)別)tree = DecisionTreeClassifier() 創(chuàng )建決策樹(shù)模型(′ω`)并訓練??(注意:此處未設置max_depth參數導致決策樹(shù)會(huì )過(guò)擬合數據集)tree.fit(X[:, np.newaxis], y) 將輸入變量擴展為二??維數組并進(jìn)行訓練(注意:此處未設置max_depth參數導致決策樹(shù)會(huì )過(guò)擬合數據集)由于輸入變量只有兩個(gè)(ge)特征且每個(gè)樣本都有一個(gè)對應的類(lèi)別標簽,因此無(wú)需設置max_depth參數即??可避免過(guò)擬合問(wèn)題;同時(shí)由于只有一個(gè)孤立點(diǎn)沒(méi)有相鄰的類(lèi)別邊界點(diǎn)與之相連,因此無(wú)需設置min_samples_split參數即可避免分裂過(guò)程中出現孤立點(diǎn);此外由??于只有(?Д?)一個(gè)孤立點(diǎn)沒(méi)有相鄰的類(lèi)別邊界點(diǎn)與┐(′ー`)┌之相連且沒(méi)有其他特殊情況影響分裂過(guò)程(如所有樣本都屬于同一類(lèi)別或所有樣本都不屬(′?`)于任何類(lèi)別),??因??此無(wú)需設置min_samp(╬?益?)les_leaf參數即可避免分裂過(guò)程中出現孤立葉節??點(diǎn);最后由于??只有一個(gè)孤立點(diǎn)沒(méi)有相鄰的類(lèi)別邊界點(diǎn)與之相連且沒(méi)有其他特殊情況影響分裂過(guò)程(如所有樣本都屬于同一類(lèi)別或所有樣本都不屬于任何類(lèi)別),因此無(wú)需設置max_features參數即可避免分裂過(guò)程??中出現異常值,最終生成的決策樹(shù)如下所示:<class 'sklearn.tree.tree.DecisionTreeClassifier'> (criterion='gini', splitter='best', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0) n_estimators=399 max features=None bootstrap=True verbose=(′?`)1 qp----C error rate??=0.0007648456484564846 sample size=399 n_classes=2 class weights=None prune empty nodes=False max leaves(′ω`*)=None min samples per leaf=1 min weight per leaf=None presort='deprec(??ヮ?)?*:???ated' ccp_*==None postsort='deprecat(╬?益?)ed' max_depth=None min_samples_split=2 min_samples_leaf=1 min_weight_fraction_leaf=0.0 subsample=1.0 sampling rate=1.0 random state=None verbose=2 warm-start=False validation set={ 398} n_iter=-1 class priors=None random state=None verbose class_{ }={ 'Iris-setosa': True 'Iris-versicolor': False 'Iris-virginica': False} decision path={ 'Iris-setosa': { '50%': array([nan]), '80%': array([nan])}, 'Iris-versico??lor': { '50%': array([nan]), '80%(′?ω?`)': array([nan])}, 'Iris-virginica': { '50%': array([nan]), '80%: array([nan])}} node depth={ 'Iris-setosa': { 'mean loss': array(??[nan]), 'impurity': array([nan]), 'value': array([nan]), ...}, 'Iris-versicolor': { 'mean lossヽ(′▽?zhuān)?ノ': array([nan]), 'impurity': array([nan]), 'value': array([nan]), ...}, 'Iris-virginica': { 'mean loss': array([nan]), 'impurity': array([nan]), 'value': array([nan]), ...}} elapsed time (h:mm:ss): XXXXXXXXXXXXXX(╯°□°)╯XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX(′_ゝ`)XXXXXXXXXXX(′?ω?`)XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX( ?° ?? ?°)XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX: XX:XX:XX accuracy: XX% (X/Y) X/Y X/Y X/┐(′д`)┌Y(╬?益?) X/Y X/Y X/Y X/Y X/Y X/Y X/Y X/Y X/Y X/Y X/Y X/Y X/Y X/Y X/Y X/Y X/Y X/Y X/Y X/Y X/Y X/Y X/Y X/Y X/Y X/(′?`*)Y X/Y