機器學習專案---預測心臟病(二)

cottpaddedC發表於2020-12-02

資料處理和資料分析請看上一篇文章

機器學習模型訓練(不使用調參的方式)

現在,我們已經將資料分為訓練集和測試集,是時候建立機器學習模型了。
我們將在訓練集上訓練它(找到模式)。
然後,我們將在測試集上測試它(使用模式)。
我們將嘗試6種不同的機器學習模型:

邏輯迴歸
最近鄰分類器
支援向量機
決策樹分類器
隨機森林分類器
XGBoost分類器
本章的學習重點:

from sklearn.model_selection import train_test_split
X = dataset.drop('target', axis=1)
y = dataset.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report

def print_score(clf, X_train, y_train, X_test, y_test, train=True):
    if train:
        pred = clf.predict(X_train)
        clf_report = pd.DataFrame(classification_report(y_train, pred, output_dict=True))
        print("Train Result:\n================================================")
        print(f"Accuracy Score: {accuracy_score(y_train, pred) * 100:.2f}%")
        print("_______________________________________________")
        print(f"CLASSIFICATION REPORT:\n{clf_report}")
        print("_______________________________________________")
        print(f"Confusion Matrix: \n {confusion_matrix(y_train, pred)}\n")
        
    elif train==False:
        pred = clf.predict(X_test)
        clf_report = pd.DataFrame(classification_report(y_test, pred, output_dict=True))
        print("Test Result:\n================================================")        
        print(f"Accuracy Score: {accuracy_score(y_test, pred) * 100:.2f}%")
        print("_______________________________________________")
        print(f"CLASSIFICATION REPORT:\n{clf_report}")
        print("_______________________________________________")
        print(f"Confusion Matrix: \n {confusion_matrix(y_test, pred)}\n")

分類報告:sklearn.metrics.classification_report(y_true, y_pred, labels=None, target_names=None,sample_weight=None, digits=2),顯示主要的分類指標,返回每個類標籤的精確、召回率及F1值
精度(precision) = 正確預測的個數(TP)/被預測正確的個數(TP+FP)

召回率(recall)=正確預測的個數(TP)/預測個數(TP+FN)

F1 = 2精度召回率/(精度+召回率)

Logistic Regression(邏輯迴歸演算法)

from sklearn.linear_model import LogisticRegression

lr_clf = LogisticRegression(solver='liblinear')
lr_clf.fit(X_train, y_train)

print_score(lr_clf, X_train, y_train, X_test, y_test, train=True)
print_score(lr_clf, X_train, y_train, X_test, y_test, train=False)

在這裡插入圖片描述

簡單粗暴的理解邏輯迴歸
從上圖的邏輯迴歸演算法模型我們是使用**sklearn.linear_model.LogisticRegression(solver=‘liblinear’, penalty=, C = )

API的介紹:
solver:*{‘liblinear’, ‘sag’, ‘saga’,‘newton-cg’, ‘lbfgs’},預設: ‘liblinear’;用於優化問題的演算法。(對於小資料集來說,“liblinear”是個不錯的選擇,而“sag”和’saga’對於大型資料集會更快。對於多類問題,只有’newton-cg’, ‘sag’, 'saga’和’lbfgs’可以處理多項損失;“liblinear”僅限於“one-versus-rest”分類。

penalty:在調參時如果我們主要的目的只是為了解決過擬合,一般penalty選擇L2正則化就夠了。但是如果選擇L2正則化發現還是 過擬合,即預測效果差的時候,就可以考慮L1正則化。(如果是L2正則化,那麼4種可選的演算法{‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’}都可以選擇。但是如果penalty是L1正則化的話,就只能選擇‘liblinear’了。)

C:一個浮點數,它指定了懲罰係數的倒數。如果它的值越小,則正則化越大。

訓練資料模型
		sklearn.linear_model.LogisticRegression().fit(X_train, y_train)

在這裡插入圖片描述
(這張圖從一個大佬的部落格摘抄,侵刪)

K-nearest neighbors(K-鄰值演算法)

在sklearn庫中,KNeighborsClassifier是實現K近鄰演算法的一個類,一般都使用歐式距離進行測量

from sklearn.neighbors import KNeighborsClassifier

knn_clf = KNeighborsClassifier()
knn_clf.fit(X_train, y_train)

print_score(knn_clf, X_train, y_train, X_test, y_test, train=True)
print_score(knn_clf, X_train, y_train, X_test, y_test, train=False)

在這裡插入圖片描述

簡單粗暴的理解k鄰值演算法:
knn_clf = KNeighborsClassifier()

KNeighborsClassifier(n_neighbors=5, weights=‘uniform’, algorithm=‘auto’, leaf_size=30, p=2, metric=‘minkowski’, metric_params=None, n_jobs=None, **kwargs)
API介紹:
n_neighbors:所選用的近鄰數,相當於K.
weights:預測的權函式,概率值。

  • uniform’:同一的權重,即每個鄰域中的所有點都是平均加權的。

  • ‘distance’ :這種情況下,距離越近權重越大,反之,距離越遠其權重越小。
    algorithm :用於計算最近鄰居的演算法,。有{‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’}

      ‘auto’      :根據樣本資料自動刷選合適的演算法。
    
      ‘ball_tree’:構建“球樹”演算法模型。
    
      ‘kd_tree’ :‘’kd樹‘’演算法。
    

max_iter :最大迭代次數。-1為無限制,預設300。

sklearn.neighbors.fit(X_train, y_train)

SVC(支援向量機)

from sklearn.svm import SVC


svm_clf = SVC(kernel='rbf', gamma=0.1, C=1.0)
svm_clf.fit(X_train, y_train)

print_score(svm_clf, X_train, y_train, X_test, y_test, train=True)
print_score(svm_clf, X_train, y_train, X_test, y_test, train=False)

在這裡插入圖片描述

簡單粗暴的理解SVC演算法:

幾個常見的API介紹:

kernel :核函式,預設是rbf,可以是‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’
– 線性:u’v
– 多項式:(gamma*u’v + coef0)^degree
– RBF函式:exp(-gamma|u-v|^2)
–sigmoid:tanh(gammau’*v + coef0)
degree :多項式poly函式的維度,預設是3,選擇其他核函式時會被忽略。
gamma : ‘rbf’,‘poly’ 和‘sigmoid’的核函式引數。預設是’auto’,則會選擇1/n_features
				  
 - gamma越大,高斯圖形越窄,模型複雜度越高,容易導致過擬合 

 -	gamma越小,高斯圖形越寬,模型複雜度越低,容易導致欠擬合		
 
 C:C-SVC的懲罰引數C?預設值是1.0
max_iter :最大迭代次數。-1為無限制。

決策樹

from sklearn.tree import DecisionTreeClassifier


tree_clf = DecisionTreeClassifier(random_state=42)
tree_clf.fit(X_train, y_train)

print_score(tree_clf, X_train, y_train, X_test, y_test, train=True)
print_score(tree_clf, X_train, y_train, X_test, y_test, train=False)

在這裡插入圖片描述

簡單粗暴的理解決策樹演算法:

決策樹是一種機器學習的方法。決策樹的生成演算法有ID3, C4.5和C5.0等。決策樹是一種樹形結構,其中每個內部節點表示一個屬性上的判斷,每個分支代表一個判斷結果的輸出,最後每個葉節點代表一種分類結果。決策樹有ID3,C4.5,CART在這裡插入圖片描述
一張圖幫你更好的理解決策樹
tree_clf = 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,class_weight=None, presort=False)API的介紹
splitter:string型別,可選(預設為"best")一種用來在節點中選擇分類的策略。支援的策略有"best",選擇最好的分類,"random"選擇最好的隨機分類

max_features:int,float,string or None 可選(預設為None)
max_depth:int or None, 可選(預設為"None")
min_samples_split:int,float, 可選(預設為2)
min_samples_leaf:int,float, 可選(預設為1)
min_weight_fraction_leaf:float, 可選(預設為0)
官網地址:https://scikitlearn.org/dev/modules/generated/sklearn.tree.DecisionTreeClassifier.html#sklearn.tree.DecisionTreeClassifier

Random Forest(隨機森林)

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import RandomizedSearchCV
​
rf_clf = RandomForestClassifier(n_estimators=1000, random_state=42)
rf_clf.fit(X_train, y_train)
​
print_score(rf_clf, X_train, y_train, X_test, y_test, train=True)
print_score(rf_clf, X_train, y_train, X_test, y_test, train=False)

在這裡插入圖片描述

簡單粗暴的理解隨機森林演算法:

隨機森林就是整合學習思想下的產物,將許多棵決策樹整合成森林,併合起來用來預測最終結果。
在這裡插入圖片描述
此圖可以幫助更好的理解(圖來至部落格)侵刪,可以簡單的理解就是決策樹就是構建分類的模型,每個節點代表著一個屬性,根據這個屬性的劃分,進入這個節點的兒子節點,直至葉子節點,每個葉子節點都表徵著一定的類別,從而達到分類的目的。而隨機森林實際上是一種特殊的袋演算法方法,它將決策樹用作袋演算法中的模型。粗暴理解就是整合
RandomForestClassifier(n_estimators=10, criterion=‘gini’, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=’auto’, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, bootstrap=True, oob_score=False, n_jobs=1, random_state=None, verbose=0, warm_start=False, class_weight=None))的API的介紹:
n_estimators : integer, optional (default=10) 整數,可選擇(預設值為10)。指森林中樹的個數
criterion : string, optional (default=”gini”) 字串,可選擇(預設值為“gini”)。用於衡量分類的質量。支援的規則有gini和entropy。其中gini用gini不純度來衡量,基尼不純度(Gini impurity),度量一個集合中每種型別的比例。entropy用資訊增益來度量。
max_features : int, float, string or None, optional (default=”auto”) 整數,浮點數,字串或者無值,可選的(預設值為"auto")
max_depth : integer or None, optional (default=None) 整數或者無值,可選的(預設為None)指樹的最大深度
min_samples_split : int, float, optional (default=2) 整數,浮點數,可選的(預設值為2)分裂一個內部節點所需的最少樣本數。
min_samples_leaf : int, float, optional (default=1) 整數,浮點數,可選的(預設值為1)在新建立的樹葉中最少的樣本數。
min_weight_fraction_leaf : float, optional (default=0.) 浮點數,可選的(預設值是0.0)在葉子節點中需要輸入資料的最少加權分數。
max_leaf_nodes : int or None, optional (default=None) 整數或者無值,可選的(預設值為None)樹增長過程中的最大葉子節點數。

XGBoost Classifer(XGBoost分類器)


from xgboost import XGBClassifier
​
xgb_clf = XGBClassifier()
xgb_clf.fit(X_train, y_train)
​
print_score(xgb_clf, X_train, y_train, X_test, y_test, train=True)
print_score(xgb_clf, X_train, y_train, X_test, y_test, train=False)

在這裡插入圖片描述
gboost可以說整合思想達到頂峰的一個模型,至少目前是這樣,所以我們學習機器學習演算法, 掌握這個是很有必要的。順帶提一下,Xgboost目前scikit-learn中沒有實現,需要我們自行安裝Xgboost,xgboots是一種基於boosting整合思想的加法模型,訓練時採用前向分佈演算法進行貪婪的學習,每次迭代都學習一棵CART樹來擬合之前 t-1 棵樹的預測結果與訓練樣本真實值的殘差。加入預設的缺失值處理,加入了二階導數資訊、正則項、列抽樣,並且可以平行計算等。

XGBClassifier()分類器的引數

booster
gbtree 樹模型做為基分類器(預設)
gbliner 線性模型做為基分類器 silent
silent=0時,輸出中間過程(預設)
silent=1時,不輸出中間過程 nthread
nthread=-1時,使用全部CPU進行並行運算(預設)
nthread=1時,使用1個CPU進行運算。 scale_pos_weight
正樣本的權重,在二分類任務中,當正負樣本比例失衡時,設定正樣本的權重,模型效果更好。例如,當正負樣本比例為1:10時,scale_pos_weight=10。
n_estimatores
含義:總共迭代的次數,即決策樹的個數
調參: early_stopping_rounds
含義:在驗證集上,當連續n次迭代,分數沒有提高後,提前終止訓練。
調參:防止overfitting。 max_depth
含義:樹的深度,預設值為6,典型值3-10。
調參:值越大,越容易過擬合;值越小,越容易欠擬合。 min_child_weight
含義:預設值為1,。
調參:值越大,越容易欠擬合;值越小,越容易過擬合(值較大時,避免模型學習到區域性的特殊樣本)。 subsample
含義:訓練每棵樹時,使用的資料佔全部訓練集的比例。預設值為1,典型值為0.5-1。
調參:防止overfitting。 colsample_bytree
含義:訓練每棵樹時,使用的特徵佔全部特徵的比例。預設值為1,典型值為0.5-1。
調參:防止overfitting。
learning_rate
含義:學習率,控制每次迭代更新權重時的步長,預設0.3。
調參:值越小,訓練越慢。
典型值為0.01-0.2。 objective 目標函式
迴歸任務
reg:linear (預設)
reg:logistic
二分類
binary:logistic 概率
binary:logitraw 類別
多分類
multi:softmax num_class=n 返回類別
multi:softprob num_class=n 返回概率
rank:pairwise eval_metric
迴歸任務(預設rmse)
rmse–均方根誤差
mae–平均絕對誤差
分類任務(預設error)
auc–roc曲線下面積
error–錯誤率(二分類)
merror–錯誤率(多分類)
logloss–負對數似然函式(二分類)
mlogloss–負對數似然函式(多分類) gamma
懲罰項係數,指定節點分裂所需的最小損失函式下降值。
調參: alpha
L1正則化係數,預設為1 lambda
L2正則化係數,預設為1

後面還會寫一篇有調參的訓練模型,

相關文章