深度学习auc_机器学习集成学习与模型融合!
對(duì)比過(guò)kaggle比賽上面的top10的模型,除了深度學(xué)習(xí)以外的模型基本上都是集成學(xué)習(xí)的產(chǎn)物。集成學(xué)習(xí)可謂是上分大殺器,今天就跟大家分享在Kaggle或者阿里天池上面大殺四方的數(shù)據(jù)科學(xué)比賽利器---集成學(xué)習(xí)。
一、什么是集成學(xué)習(xí)
- 正所謂“三個(gè)臭皮匠賽過(guò)諸葛亮”的道理,在機(jī)器學(xué)習(xí)數(shù)據(jù)挖掘的工程項(xiàng)目中,使用單一決策的弱分類(lèi)器顯然不是一個(gè)明智的選擇,因?yàn)楦鞣N分類(lèi)器在設(shè)計(jì)的時(shí)候都有自己的優(yōu)勢(shì)和缺點(diǎn),也就是說(shuō)每個(gè)分類(lèi)器都有自己工作偏向,那集成學(xué)習(xí)就是平衡各個(gè)分類(lèi)器的優(yōu)缺點(diǎn),使得我們的分類(lèi)任務(wù)完成的更加優(yōu)秀。
在大多數(shù)情況下,這些基本模型本身的性能并不是非常好,這要么是因?yàn)樗鼈兙哂休^高的偏差(例如,低自由度模型),要么是因?yàn)樗麄兊姆讲钐髮?dǎo)致魯棒性不強(qiáng)(例如,高自由度模型)。集成方法的思想是通過(guò)將這些弱學(xué)習(xí)器的偏差和/或方差結(jié)合起來(lái),從而創(chuàng)建一個(gè)「強(qiáng)學(xué)習(xí)器」(或「集成模型」),從而獲得更好的性能。
集成學(xué)習(xí)的方法:
- 1. 基于投票思想的多數(shù)票機(jī)制的集成分類(lèi)器(MajorityVoteClassifier)
- 2. 于bagging思想的套袋集成技術(shù)(BaggingClassifier)
- 3. 基于boosting思想的自適應(yīng)增強(qiáng)方法(Adaboost)
- 4. 分層模型集成框架stacking(疊加算法)
二、基于投票思想的集成分類(lèi)器
以上是多數(shù)投票的流程圖:
- 分別訓(xùn)練n個(gè)弱分類(lèi)器。
- 對(duì)每個(gè)弱分類(lèi)器輸出預(yù)測(cè)結(jié)果,并投票(如下圖)
每個(gè)樣本取投票數(shù)最多的那個(gè)預(yù)測(cè)為該樣本最終分類(lèi)預(yù)測(cè)。
加載相關(guān)庫(kù):
## 加載相關(guān)庫(kù)from sklearn.datasets import load_iris # 加載數(shù)據(jù)
from sklearn.model_selection import train_test_split # 切分訓(xùn)練集與測(cè)試集
from sklearn.preprocessing import StandardScaler # 標(biāo)準(zhǔn)化數(shù)據(jù)
from sklearn.preprocessing import LabelEncoder # 標(biāo)簽化分類(lèi)變量
初步處理數(shù)據(jù)
## 初步處理數(shù)據(jù)iris = load_iris()
X,y = iris.data[50:,[1,2]],iris.target[50:]
le = LabelEncoder()
y = le.fit_transform(y)
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.5,random_state=1,stratify=y)
我們使用訓(xùn)練集訓(xùn)練三種不同的分類(lèi)器:邏輯回歸 + 決策樹(shù) + k-近鄰分類(lèi)器
## 我們使用訓(xùn)練集訓(xùn)練三種不同的分類(lèi)器:邏輯回歸 + 決策樹(shù) + k-近鄰分類(lèi)器from sklearn.model_selection import cross_val_score # 10折交叉驗(yàn)證評(píng)價(jià)模型
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.pipeline import Pipeline # 管道簡(jiǎn)化工作流
clf1 = LogisticRegression(penalty='l2',C=0.001,random_state=1)
clf2 = DecisionTreeClassifier(max_depth=1,criterion='entropy',random_state=0)
clf3 = KNeighborsClassifier(n_neighbors=1,p=2,metric="minkowski")
pipe1 = Pipeline([['sc',StandardScaler()],['clf',clf1]])
pipe3 = Pipeline([['sc',StandardScaler()],['clf',clf3]])
clf_labels = ['Logistic regression','Decision tree','KNN']
print('10-folds cross validation :\n')
for clf,label in zip([pipe1,clf2,pipe3],clf_labels):
scores = cross_val_score(estimator=clf,X=X_train,y=y_train,cv=10,scoring='roc_auc')
print("ROC AUC: %0.2f(+/- %0.2f)[%s]"%(scores.mean(),scores.std(),label))
我們使用MajorityVoteClassifier集成:
## 我們使用MajorityVoteClassifier集成:from sklearn.ensemble import VotingClassifier
mv_clf = VotingClassifier(estimators=[('pipe1',pipe1),('clf2',clf2),('pipe3',pipe3)],voting='soft')
clf_labels += ['MajorityVoteClassifier']
all_clf = [pipe1,clf2,pipe3,mv_clf]
print('10-folds cross validation :\n')
for clf,label in zip(all_clf,clf_labels):
scores = cross_val_score(estimator=clf,X=X_train,y=y_train,cv=10,scoring='roc_auc')
print("ROC AUC: %0.2f(+/- %0.2f)[%s]"%(scores.mean(),scores.std(),label))
## 對(duì)比下面結(jié)果,可以得知多數(shù)投票方式的分類(lèi)算法,抗差能力更強(qiáng)。
使用ROC曲線評(píng)估集成分類(lèi)器:
## 使用ROC曲線評(píng)估集成分類(lèi)器from sklearn.metrics import roc_curve
from sklearn.metrics import auc
colors = ['black','orange','blue','green']
linestyles = [':','--','-.','-']
plt.figure(figsize=(10,6))
for clf,label,clr,ls in zip(all_clf,clf_labels,colors,linestyles):
y_pred = clf.fit(X_train,y_train).predict_proba(X_test)[:,1]
fpr,tpr,trhresholds = roc_curve(y_true=y_test,y_score=y_pred)
roc_auc = auc(x=fpr,y=tpr)
plt.plot(fpr,tpr,color=clr,linestyle=ls,label='%s (auc=%0.2f)'%(label,roc_auc))
plt.legend(loc='lower right')
plt.plot([0,1],[0,1],linestyle='--',color='gray',linewidth=2)
plt.xlim([-0.1,1.1])
plt.ylim([-0.1,1.1])
plt.xlabel('False positive rate (FPR)')
plt.xlabel('True positive rate (TPR)')
plt.show()
三、基于bagging思想的套袋集成技術(shù)
套袋方法是由柳.布萊曼在1994年的技術(shù)報(bào)告中首先提出并證明了套袋方法可以提高不穩(wěn)定模型的準(zhǔn)確度的同時(shí)降低過(guò)擬合的程度(可降低方差)。
套袋方法的流程如下:
注意:套袋方法與投票方法的不同:
投票機(jī)制在訓(xùn)練每個(gè)分類(lèi)器的時(shí)候都是用相同的全部樣本,而B(niǎo)agging方法則是使用全部樣本的一個(gè)隨機(jī)抽樣,每個(gè)分類(lèi)器都是使用不同的樣本進(jìn)行訓(xùn)練。其他都是跟投票方法一模一樣!
- 對(duì)訓(xùn)練集隨機(jī)采樣
- 分別基于不同的樣本集合訓(xùn)練n個(gè)弱分類(lèi)器。
- 對(duì)每個(gè)弱分類(lèi)器輸出預(yù)測(cè)結(jié)果,并投票(如下圖)
- 每個(gè)樣本取投票數(shù)最多的那個(gè)預(yù)測(cè)為該樣本最終分類(lèi)預(yù)測(cè)。
我們使用葡萄酒數(shù)據(jù)集進(jìn)行建模(數(shù)據(jù)處理):
## 我們使用葡萄酒數(shù)據(jù)集進(jìn)行建模(數(shù)據(jù)處理)df_wine = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data',header=None)
df_wine.columns = ['Class label', 'Alcohol','Malic acid', 'Ash','Alcalinity of ash','Magnesium', 'Total phenols',
'Flavanoids', 'Nonflavanoid phenols','Proanthocyanins','Color intensity', 'Hue','OD280/OD315 of diluted wines','Proline']
df_wine = df_wine[df_wine['Class label'] != 1] # drop 1 class
y = df_wine['Class label'].values
X = df_wine[['Alcohol','OD280/OD315 of diluted wines']].values
from sklearn.model_selection import train_test_split # 切分訓(xùn)練集與測(cè)試集
from sklearn.preprocessing import LabelEncoder # 標(biāo)簽化分類(lèi)變量
le = LabelEncoder()
y = le.fit_transform(y)
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=1,stratify=y)
我們使用單一決策樹(shù)分類(lèi):
## 我們使用單一決策樹(shù)分類(lèi):tree = DecisionTreeClassifier(criterion='entropy',random_state=1,max_depth=None) #選擇決策樹(shù)為基本分類(lèi)器
from sklearn.metrics import accuracy_score
tree = tree.fit(X_train,y_train)
y_train_pred = tree.predict(X_train)
y_test_pred = tree.predict(X_test)
tree_train = accuracy_score(y_train,y_train_pred)
tree_test = accuracy_score(y_test,y_test_pred)
print('Decision tree train/test accuracies %.3f/%.3f' % (tree_train,tree_test))
我們使用BaggingClassifier分類(lèi):
## 我們使用BaggingClassifier分類(lèi):from sklearn.ensemble import BaggingClassifier
tree = DecisionTreeClassifier(criterion='entropy',random_state=1,max_depth=None) #選擇決策樹(shù)為基本分類(lèi)器
bag = BaggingClassifier(base_estimator=tree,n_estimators=500,max_samples=1.0,max_features=1.0,bootstrap=True,
bootstrap_features=False,n_jobs=1,random_state=1)
from sklearn.metrics import accuracy_score
bag = bag.fit(X_train,y_train)
y_train_pred = bag.predict(X_train)
y_test_pred = bag.predict(X_test)
bag_train = accuracy_score(y_train,y_train_pred)
bag_test = accuracy_score(y_test,y_test_pred)
print('Bagging train/test accuracies %.3f/%.3f' % (bag_train,bag_test))
我們可以對(duì)比兩個(gè)準(zhǔn)確率,測(cè)試準(zhǔn)確率較之決策樹(shù)得到了顯著的提高
我們來(lái)對(duì)比下這兩個(gè)分類(lèi)方法上的差異:
## 我們來(lái)對(duì)比下這兩個(gè)分類(lèi)方法上的差異x_min = X_train[:, 0].min() - 1
x_max = X_train[:, 0].max() + 1
y_min = X_train[:, 1].min() - 1
y_max = X_train[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),np.arange(y_min, y_max, 0.1))
f, axarr = plt.subplots(nrows=1, ncols=2,sharex='col',sharey='row',figsize=(12, 6))
for idx, clf, tt in zip([0, 1],[tree, bag],['Decision tree', 'Bagging']):
clf.fit(X_train, y_train)
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
axarr[idx].contourf(xx, yy, Z, alpha=0.3)
axarr[idx].scatter(X_train[y_train==0, 0],X_train[y_train==0, 1],c='blue', marker='^')
axarr[idx].scatter(X_train[y_train==1, 0],X_train[y_train==1, 1],c='green', marker='o')
axarr[idx].set_title(tt)
axarr[0].set_ylabel('Alcohol', fontsize=12)
plt.tight_layout()
plt.text(0, -0.2,s='OD280/OD315 of diluted wines',ha='center',va='center',fontsize=12,transform=axarr[1].transAxes)
plt.show()
從結(jié)果圖看起來(lái),三個(gè)節(jié)點(diǎn)深度的決策樹(shù)分段線性決策邊界在Bagging集成中看起來(lái)更加平滑。
四、基于boosting思想的自適應(yīng)增強(qiáng)方法
Adaboost最初的想法是由Robert E. Schapire在1990年提出的,這個(gè)想法叫做自適應(yīng)增強(qiáng)方法。
與Bagging相比,Boosting思想可以降低偏差。
原始的增強(qiáng)過(guò)程具體的實(shí)現(xiàn)如下:
AdaBoost的具體步驟如下:
如更新權(quán)重如下圖:
我們用單一決策樹(shù)建模:
## 我們用單一決策樹(shù)建模:from sklearn.ensemble import AdaBoostClassifier
tree = DecisionTreeClassifier(criterion='entropy',random_state=1,max_depth=1)
from sklearn.metrics import accuracy_score
tree = tree.fit(X_train,y_train)
y_train_pred = tree.predict(X_train)
y_test_pred = tree.predict(X_test)
tree_train = accuracy_score(y_train,y_train_pred)
tree_test = accuracy_score(y_test,y_test_pred)
print('Decision tree train/test accuracies %.3f/%.3f' % (tree_train,tree_test))
我們使用Adaboost集成建模:
## 我們使用Adaboost集成建模:ada = AdaBoostClassifier(base_estimator=tree,n_estimators=500,learning_rate=0.1,random_state=1)
ada = ada.fit(X_train,y_train)
y_train_pred = ada.predict(X_train)
y_test_pred = ada.predict(X_test)
ada_train = accuracy_score(y_train,y_train_pred)
ada_test = accuracy_score(y_test,y_test_pred)
print('Adaboost train/test accuracies %.3f/%.3f' % (ada_train,ada_test))
我們觀察下Adaboost與決策樹(shù)的異同:
## 我們觀察下Adaboost與決策樹(shù)的異同x_min = X_train[:, 0].min() - 1
x_max = X_train[:, 0].max() + 1
y_min = X_train[:, 1].min() - 1
y_max = X_train[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),np.arange(y_min, y_max, 0.1))
f, axarr = plt.subplots(nrows=1, ncols=2,sharex='col',sharey='row',figsize=(12, 6))
for idx, clf, tt in zip([0, 1],[tree, ada],['Decision tree', 'Adaboost']):
clf.fit(X_train, y_train)
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
axarr[idx].contourf(xx, yy, Z, alpha=0.3)
axarr[idx].scatter(X_train[y_train==0, 0],X_train[y_train==0, 1],c='blue', marker='^')
axarr[idx].scatter(X_train[y_train==1, 0],X_train[y_train==1, 1],c='red', marker='o')
axarr[idx].set_title(tt)
axarr[0].set_ylabel('Alcohol', fontsize=12)
plt.tight_layout()
plt.text(0, -0.2,s='OD280/OD315 of diluted wines',ha='center',va='center',fontsize=12,transform=axarr[1].transAxes)
plt.show()
從結(jié)果圖看起來(lái),Adaboost決策邊界比單層決策樹(shù)復(fù)雜得多!
五、分層模型集成框架stacking(疊加算法)
Stacking集成算法可以理解為一個(gè)兩層的集成,第一層含有一個(gè)分類(lèi)器,把預(yù)測(cè)的結(jié)果(元特征)提供給第二層, 而第二層的分類(lèi)器通常是邏輯回歸,他把一層分類(lèi)器的結(jié)果當(dāng)做特征做擬合輸出預(yù)測(cè)結(jié)果。過(guò)程如下圖:
標(biāo)準(zhǔn)的Stacking,也叫Blending如下圖:
但是,標(biāo)準(zhǔn)的Stacking會(huì)導(dǎo)致信息泄露,所以推薦以下Satcking算法:
由于目前sklearn沒(méi)有Stacking相關(guān)的類(lèi),因此我們使用mlxtend庫(kù)!!!!
詳細(xì)代碼內(nèi)容查看:
http://rasbt.github.io/mlxtend/user_guide/classifier/StackingClassifier/
http://rasbt.github.io/mlxtend/user_guide/classifier/StackingCVClassifier/
1. 簡(jiǎn)單堆疊3折CV分類(lèi):
## 1. 簡(jiǎn)單堆疊3折CV分類(lèi)from sklearn import datasets
iris = datasets.load_iris()
X, y = iris.data[:, 1:3], iris.target
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.ensemble import RandomForestClassifier
from mlxtend.classifier import StackingCVClassifier
RANDOM_SEED = 42
clf1 = KNeighborsClassifier(n_neighbors=1)
clf2 = RandomForestClassifier(random_state=RANDOM_SEED)
clf3 = GaussianNB()
lr = LogisticRegression()
# Starting from v0.16.0, StackingCVRegressor supports
# `random_state` to get deterministic result.
sclf = StackingCVClassifier(classifiers=[clf1, clf2, clf3], # 第一層分類(lèi)器
meta_classifier=lr, # 第二層分類(lèi)器
random_state=RANDOM_SEED)
print('3-fold cross validation:\n')
for clf, label in zip([clf1, clf2, clf3, sclf], ['KNN', 'Random Forest', 'Naive Bayes','StackingClassifier']):
scores = cross_val_score(clf, X, y, cv=3, scoring='accuracy')
print("Accuracy: %0.2f (+/- %0.2f) [%s]" % (scores.mean(), scores.std(), label))
我們畫(huà)出決策邊界:
## 我們畫(huà)出決策邊界from mlxtend.plotting import plot_decision_regions
import matplotlib.gridspec as gridspec
import itertools
gs = gridspec.GridSpec(2, 2)
fig = plt.figure(figsize=(10,8))
for clf, lab, grd in zip([clf1, clf2, clf3, sclf],
['KNN',
'Random Forest',
'Naive Bayes',
'StackingCVClassifier'],
itertools.product([0, 1], repeat=2)):
clf.fit(X, y)
ax = plt.subplot(gs[grd[0], grd[1]])
fig = plot_decision_regions(X=X, y=y, clf=clf)
plt.title(lab)
plt.show()
2.使用概率作為元特征:
## 2.使用概率作為元特征clf1 = KNeighborsClassifier(n_neighbors=1)
clf2 = RandomForestClassifier(random_state=1)
clf3 = GaussianNB()
lr = LogisticRegression()
sclf = StackingCVClassifier(classifiers=[clf1, clf2, clf3],
use_probas=True,
meta_classifier=lr,
random_state=42)
print('3-fold cross validation:\n')
for clf, label in zip([clf1, clf2, clf3, sclf],
['KNN',
'Random Forest',
'Naive Bayes',
'StackingClassifier']):
scores = cross_val_score(clf, X, y,
cv=3, scoring='accuracy')
print("Accuracy: %0.2f (+/- %0.2f) [%s]"
% (scores.mean(), scores.std(), label))
3. 堆疊5折CV分類(lèi)與網(wǎng)格搜索(結(jié)合網(wǎng)格搜索調(diào)參優(yōu)化):
## 3. 堆疊5折CV分類(lèi)與網(wǎng)格搜索(結(jié)合網(wǎng)格搜索調(diào)參優(yōu)化)from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from mlxtend.classifier import StackingCVClassifier
# Initializing models
clf1 = KNeighborsClassifier(n_neighbors=1)
clf2 = RandomForestClassifier(random_state=RANDOM_SEED)
clf3 = GaussianNB()
lr = LogisticRegression()
sclf = StackingCVClassifier(classifiers=[clf1, clf2, clf3],
meta_classifier=lr,
random_state=42)
params = {'kneighborsclassifier__n_neighbors': [1, 5],
'randomforestclassifier__n_estimators': [10, 50],
'meta_classifier__C': [0.1, 10.0]}
grid = GridSearchCV(estimator=sclf,
param_grid=params,
cv=5,
refit=True)
grid.fit(X, y)
cv_keys = ('mean_test_score', 'std_test_score', 'params')
for r, _ in enumerate(grid.cv_results_['mean_test_score']):
print("%0.3f +/- %0.2f %r"
% (grid.cv_results_[cv_keys[0]][r],
grid.cv_results_[cv_keys[1]][r] / 2.0,
grid.cv_results_[cv_keys[2]][r]))
print('Best parameters: %s' % grid.best_params_)
print('Accuracy: %.2f' % grid.best_score_)
如果我們打算多次使用回歸算法,我們要做的就是在參數(shù)網(wǎng)格中添加一個(gè)附加的數(shù)字后綴,如下所示:
## 如果我們打算多次使用回歸算法,我們要做的就是在參數(shù)網(wǎng)格中添加一個(gè)附加的數(shù)字后綴,如下所示:from sklearn.model_selection import GridSearchCV
# Initializing models
clf1 = KNeighborsClassifier(n_neighbors=1)
clf2 = RandomForestClassifier(random_state=RANDOM_SEED)
clf3 = GaussianNB()
lr = LogisticRegression()
sclf = StackingCVClassifier(classifiers=[clf1, clf1, clf2, clf3],
meta_classifier=lr,
random_state=RANDOM_SEED)
params = {'kneighborsclassifier-1__n_neighbors': [1, 5],
'kneighborsclassifier-2__n_neighbors': [1, 5],
'randomforestclassifier__n_estimators': [10, 50],
'meta_classifier__C': [0.1, 10.0]}
grid = GridSearchCV(estimator=sclf,
param_grid=params,
cv=5,
refit=True)
grid.fit(X, y)
cv_keys = ('mean_test_score', 'std_test_score', 'params')
for r, _ in enumerate(grid.cv_results_['mean_test_score']):
print("%0.3f +/- %0.2f %r"
% (grid.cv_results_[cv_keys[0]][r],
grid.cv_results_[cv_keys[1]][r] / 2.0,
grid.cv_results_[cv_keys[2]][r]))
print('Best parameters: %s' % grid.best_params_)
print('Accuracy: %.2f' % grid.best_score_)
4.在不同特征子集上運(yùn)行的分類(lèi)器的堆疊:
## 4.在不同特征子集上運(yùn)行的分類(lèi)器的堆疊###不同的1級(jí)分類(lèi)器可以適合訓(xùn)練數(shù)據(jù)集中的不同特征子集。以下示例說(shuō)明了如何使用scikit-learn管道和ColumnSelector:
from sklearn.datasets import load_iris
from mlxtend.classifier import StackingCVClassifier
from mlxtend.feature_selection import ColumnSelector
from sklearn.pipeline import make_pipeline
from sklearn.linear_model import LogisticRegression
iris = load_iris()
X = iris.data
y = iris.target
pipe1 = make_pipeline(ColumnSelector(cols=(0, 2)), # 選擇第0,2列
LogisticRegression())
pipe2 = make_pipeline(ColumnSelector(cols=(1, 2, 3)), # 選擇第1,2,3列
LogisticRegression())
sclf = StackingCVClassifier(classifiers=[pipe1, pipe2],
meta_classifier=LogisticRegression(),
random_state=42)
sclf.fit(X, y)
5.ROC曲線 decision_function:
## 5.ROC曲線 decision_function### 像其他scikit-learn分類(lèi)器一樣,它StackingCVClassifier具有decision_function可用于繪制ROC曲線的方法。
### 請(qǐng)注意,decision_function期望并要求元分類(lèi)器實(shí)現(xiàn)decision_function。
from sklearn import model_selection
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier
from mlxtend.classifier import StackingCVClassifier
from sklearn.metrics import roc_curve, auc
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn.preprocessing import label_binarize
from sklearn.multiclass import OneVsRestClassifier
iris = datasets.load_iris()
X, y = iris.data[:, [0, 1]], iris.target
# Binarize the output
y = label_binarize(y, classes=[0, 1, 2])
n_classes = y.shape[1]
RANDOM_SEED = 42
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.33, random_state=RANDOM_SEED)
clf1 = LogisticRegression()
clf2 = RandomForestClassifier(random_state=RANDOM_SEED)
clf3 = SVC(random_state=RANDOM_SEED)
lr = LogisticRegression()
sclf = StackingCVClassifier(classifiers=[clf1, clf2, clf3],
meta_classifier=lr)
# Learn to predict each class against the other
classifier = OneVsRestClassifier(sclf)
y_score = classifier.fit(X_train, y_train).decision_function(X_test)
# Compute ROC curve and ROC area for each class
fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(n_classes):
fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i])
roc_auc[i] = auc(fpr[i], tpr[i])
# Compute micro-average ROC curve and ROC area
fpr["micro"], tpr["micro"], _ = roc_curve(y_test.ravel(), y_score.ravel())
roc_auc["micro"] = auc(fpr["micro"], tpr["micro"])
plt.figure()
lw = 2
plt.plot(fpr[2], tpr[2], color='darkorange',
lw=lw, label='ROC curve (area = %0.2f)' % roc_auc[2])
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()
本文PDF電子版? 后臺(tái)回復(fù)"集成學(xué)習(xí)"獲取“整理不易,點(diǎn)贊三連↓
總結(jié)
以上是生活随笔為你收集整理的深度学习auc_机器学习集成学习与模型融合!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 安装ssr_12月23日先锋首测启动,累
- 下一篇: 梳理百年深度学习发展史-七月在线机器学习