利用Python畫(huà)ROC曲線,以及AUC值的計(jì)算\

成都創(chuàng)新互聯(lián)主營(yíng)龍華網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都app開(kāi)發(fā),龍華h5微信小程序搭建,龍華網(wǎng)站營(yíng)銷(xiāo)推廣歡迎龍華等地區(qū)企業(yè)咨詢
前言
ROC(Receiver Operating Characteristic)曲線和AUC常被用來(lái)評(píng)價(jià)一個(gè)二值分類(lèi)器(binary classifier)的優(yōu)劣。這篇文章將先簡(jiǎn)單的介紹ROC和AUC,而后用實(shí)例演示如何python作出ROC曲線圖以及計(jì)算AUC。
AUC介紹
AUC(Area Under Curve)是機(jī)器學(xué)習(xí)二分類(lèi)模型中非常常用的評(píng)估指標(biāo),相比于F1-Score對(duì)項(xiàng)目的不平衡有更大的容忍性,目前常見(jiàn)的機(jī)器學(xué)習(xí)庫(kù)中(比如scikit-learn)一般也都是集成該指標(biāo)的計(jì)算,但是有時(shí)候模型是單獨(dú)的或者自己編寫(xiě)的,此時(shí)想要評(píng)估訓(xùn)練模型的好壞就得自己搞一個(gè)AUC計(jì)算模塊,本文在查詢資料時(shí)發(fā)現(xiàn)libsvm-tools有一個(gè)非常通俗易懂的auc計(jì)算,因此摳出來(lái)用作日后之用。
AUC計(jì)算
AUC的計(jì)算分為下面三個(gè)步驟:
1、計(jì)算數(shù)據(jù)的準(zhǔn)備,如果模型訓(xùn)練時(shí)只有訓(xùn)練集的話一般使用交叉驗(yàn)證的方式來(lái)計(jì)算,如果有評(píng)估集(evaluate)一般就可以直接計(jì)算了,數(shù)據(jù)的格式一般就是需要預(yù)測(cè)得分以及其目標(biāo)類(lèi)別(注意是目標(biāo)類(lèi)別,不是預(yù)測(cè)得到的類(lèi)別)
2、根據(jù)閾值劃分得到橫(X:False Positive Rate)以及縱(Y:True Positive Rate)點(diǎn)
3、將坐標(biāo)點(diǎn)連成曲線之后計(jì)算其曲線下面積,就是AUC的值
直接上python代碼
#! -*- coding=utf-8 -*-
import pylab as pl
from math import log,exp,sqrt
evaluate_result="you file path"
db = [] #[score,nonclk,clk]
pos, neg = 0, 0
with open(evaluate_result,'r') as fs:
for line in fs:
nonclk,clk,score = line.strip().split('\t')
nonclk = int(nonclk)
clk = int(clk)
score = float(score)
db.append([score,nonclk,clk])
pos += clk
neg += nonclk
db = sorted(db, key=lambda x:x[0], reverse=True)
#計(jì)算ROC坐標(biāo)點(diǎn)
xy_arr = []
tp, fp = 0., 0.
for i in range(len(db)):
tp += db[i][2]
fp += db[i][1]
xy_arr.append([fp/neg,tp/pos])
#計(jì)算曲線下面積
auc = 0.
prev_x = 0
for x,y in xy_arr:
if x != prev_x:
auc += (x - prev_x) * y
prev_x = x
print "the auc is %s."%auc
x = [_v[0] for _v in xy_arr]
y = [_v[1] for _v in xy_arr]
pl.title("ROC curve of %s (AUC = %.4f)" % ('svm',auc))
pl.xlabel("False Positive Rate")
pl.ylabel("True Positive Rate")
pl.plot(x, y)# use pylab to plot x and y
pl.show()# show the plot on the screen
輸入的數(shù)據(jù)集可以參考svm預(yù)測(cè)結(jié)果
其格式為:
nonclk \t clk \t score
其中:
1、nonclick:未點(diǎn)擊的數(shù)據(jù),可以看做負(fù)樣本的數(shù)量
2、clk:點(diǎn)擊的數(shù)量,可以看做正樣本的數(shù)量
3、score:預(yù)測(cè)的分?jǐn)?shù),以該分?jǐn)?shù)為group進(jìn)行正負(fù)樣本的預(yù)統(tǒng)計(jì)可以減少AUC的計(jì)算量
運(yùn)行的結(jié)果為:
如果本機(jī)沒(méi)安裝pylab可以直接注釋依賴以及畫(huà)圖部分
注意
上面貼的代碼:
1、只能計(jì)算二分類(lèi)的結(jié)果(至于二分類(lèi)的標(biāo)簽隨便處理)
2、上面代碼中每個(gè)score都做了一次閾值,其實(shí)這樣效率是相當(dāng)?shù)偷模梢詫?duì)樣本進(jìn)行采樣或者在計(jì)算橫軸坐標(biāo)時(shí)進(jìn)行等分計(jì)算
使用sklearn的一系列方法后可以很方便的繪制處ROC曲線,這里簡(jiǎn)單實(shí)現(xiàn)以下。
主要是利用混淆矩陣中的知識(shí)作為繪制的數(shù)據(jù)(如果不是很懂可以先看看這里的基礎(chǔ)):
tpr(Ture Positive Rate):真陽(yáng)率 圖像的縱坐標(biāo)
fpr(False Positive Rate):陽(yáng)率(偽陽(yáng)率) 圖像的橫坐標(biāo)
mean_tpr:累計(jì)真陽(yáng)率求平均值
mean_fpr:累計(jì)陽(yáng)率求平均值
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets
from sklearn.metrics import roc_curve, auc
from sklearn.model_selection import StratifiedKFold
iris = datasets.load_iris()
X = iris.data
y = iris.target
X, y = X[y != 2], y[y != 2] # 去掉了label為2,label只能二分,才可以。
n_samples, n_features = X.shape
# 增加噪聲特征
random_state = np.random.RandomState(0)
X = np.c_[X, random_state.randn(n_samples, 200 * n_features)]
cv = StratifiedKFold(n_splits=6) #導(dǎo)入該模型,后面將數(shù)據(jù)劃分6份
classifier = svm.SVC(kernel='linear', probability=True,random_state=random_state) # SVC模型 可以換作AdaBoost模型試試
# 畫(huà)平均ROC曲線的兩個(gè)參數(shù)
mean_tpr = 0.0 # 用來(lái)記錄畫(huà)平均ROC曲線的信息
mean_fpr = np.linspace(0, 1, 100)
cnt = 0
for i, (train, test) in enumerate(cv.split(X,y)): #利用模型劃分?jǐn)?shù)據(jù)集和目標(biāo)變量 為一一對(duì)應(yīng)的下標(biāo)
cnt +=1
probas_ = classifier.fit(X[train], y[train]).predict_proba(X[test]) # 訓(xùn)練模型后預(yù)測(cè)每條樣本得到兩種結(jié)果的概率
fpr, tpr, thresholds = roc_curve(y[test], probas_[:, 1]) # 該函數(shù)得到偽正例、真正例、閾值,這里只使用前兩個(gè)
mean_tpr += np.interp(mean_fpr, fpr, tpr) # 插值函數(shù) interp(x坐標(biāo),每次x增加距離,y坐標(biāo)) 累計(jì)每次循環(huán)的總值后面求平均值
mean_tpr[0] = 0.0 # 將第一個(gè)真正例=0 以0為起點(diǎn)
roc_auc = auc(fpr, tpr) # 求auc面積
plt.plot(fpr, tpr, lw=1, label='ROC fold {0:.2f} (area = {1:.2f})'.format(i, roc_auc)) # 畫(huà)出當(dāng)前分割數(shù)據(jù)的ROC曲線
plt.plot([0, 1], [0, 1], '--', color=(0.6, 0.6, 0.6), label='Luck') # 畫(huà)對(duì)角線
mean_tpr /= cnt # 求數(shù)組的平均值
mean_tpr[-1] = 1.0 # 坐標(biāo)最后一個(gè)點(diǎn)為(1,1) 以1為終點(diǎn)
mean_auc = auc(mean_fpr, mean_tpr)
plt.plot(mean_fpr, mean_tpr, 'k--',label='Mean ROC (area = {0:.2f})'.format(mean_auc), lw=2)
plt.xlim([-0.05, 1.05]) # 設(shè)置x、y軸的上下限,設(shè)置寬一點(diǎn),以免和邊緣重合,可以更好的觀察圖像的整體
plt.ylim([-0.05, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate') # 可以使用中文,但需要導(dǎo)入一些庫(kù)即字體
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()
預(yù)測(cè)模型的分解過(guò)程
我總是集中于投入有質(zhì)量的時(shí)間在建模的初始階段,比如,假設(shè)生成、頭腦風(fēng)暴、討論或理解可能的結(jié)果范圍。所有這些活動(dòng)都有助于我解決問(wèn)題,并最終讓我設(shè)計(jì)出更強(qiáng)大的商業(yè)解決方案。為什么你要在前面花費(fèi)這段時(shí)間,這有充分的理由:
你有足夠的時(shí)間投入并且你是無(wú)經(jīng)驗(yàn)的(這是有影響的)
你不帶有其它數(shù)據(jù)觀點(diǎn)或想法的偏見(jiàn)(我總是建議,在深入研究數(shù)據(jù)之前做假設(shè)生成)
在后面的階段,你會(huì)急于完成該項(xiàng)目而沒(méi)有能力投入有質(zhì)量的時(shí)間了。
這個(gè)階段需要投入高質(zhì)量時(shí)間,因此我沒(méi)有提及時(shí)間表,不過(guò)我建議你把它作為標(biāo)準(zhǔn)的做法。這有助于你建立建立更好地預(yù)測(cè)模型,在后面的階段的只需較少的迭代工作。讓我們來(lái)看看建立第一個(gè)模型的剩余階段的時(shí)間表:
數(shù)據(jù)描述性分析——50%的時(shí)間
數(shù)據(jù)預(yù)處理(缺失值和異常值修復(fù))——40%的時(shí)間
數(shù)據(jù)建模——4%的時(shí)間
性能預(yù)測(cè)——6%的時(shí)間
讓我們一步一步完成每個(gè)過(guò)程(每一步投入預(yù)測(cè)的時(shí)間):
階段1:描述性分析/數(shù)據(jù)探索
在我剛開(kāi)始成為數(shù)據(jù)科學(xué)家的時(shí)候,數(shù)據(jù)探索占據(jù)了我大量的時(shí)間。不過(guò),隨著時(shí)間的推移,我已經(jīng)把大量的數(shù)據(jù)操作自動(dòng)化了。由于數(shù)據(jù)準(zhǔn)備占據(jù)建立第一個(gè)模型工作量的50%,自動(dòng)化的好處是顯而易見(jiàn)的。
這是我們的第一個(gè)基準(zhǔn)模型,我們?nèi)サ羧魏翁卣髟O(shè)計(jì)。因此,描述分析所需的時(shí)間僅限于了解缺失值和直接可見(jiàn)的大的特征。在我的方法體系中,你將需要2分鐘來(lái)完成這一步(假設(shè),100000個(gè)觀測(cè)數(shù)據(jù)集)。
我的第一個(gè)模型執(zhí)行的操作:
確定ID,輸入特征和目標(biāo)特征
確定分類(lèi)和數(shù)值特征
識(shí)別缺失值所在列
階段2:數(shù)據(jù)預(yù)處理(缺失值處理)
有許多方法可以解決這個(gè)問(wèn)題。對(duì)于我們的第一個(gè)模型,我們將專(zhuān)注于智能和快速技術(shù)來(lái)建立第一個(gè)有效模型。
為缺失值創(chuàng)建假標(biāo)志:有用,有時(shí)缺失值本身就攜帶了大量的信息。
用均值、中位數(shù)或其它簡(jiǎn)單方法填補(bǔ)缺失值:均值和中位數(shù)填補(bǔ)都表現(xiàn)良好,大多數(shù)人喜歡用均值填補(bǔ)但是在有偏分布的情況下我建議使用中位數(shù)。其它智能的方法與均值和中位數(shù)填補(bǔ)類(lèi)似,使用其它相關(guān)特征填補(bǔ)或建立模型。比如,在Titanic生存挑戰(zhàn)中,你可以使用乘客名字的稱呼,比如:“Mr.”, “Miss.”,”Mrs.”,”Master”,來(lái)填補(bǔ)年齡的缺失值,這對(duì)模型性能有很好的影響。
填補(bǔ)缺失的分類(lèi)變量:創(chuàng)建一個(gè)新的等級(jí)來(lái)填補(bǔ)分類(lèi)變量,讓所有的缺失值編碼為一個(gè)單一值比如,“New_Cat”,或者,你可以看看頻率組合,使用高頻率的分類(lèi)變量來(lái)填補(bǔ)缺失值。
由于數(shù)據(jù)處理方法如此簡(jiǎn)單,你可以只需要3到4分鐘來(lái)處理數(shù)據(jù)。
階段3:數(shù)據(jù)建模
根據(jù)不同的業(yè)務(wù)問(wèn)題,我推薦使用GBM或RandomForest技術(shù)的任意一種。這兩個(gè)技術(shù)可以極其有效地創(chuàng)建基準(zhǔn)解決方案。我已經(jīng)看到數(shù)據(jù)科學(xué)家通常把這兩個(gè)方法作為他們的第一個(gè)模型同時(shí)也作為最后一個(gè)模型。這最多用去4到5分鐘。
階段4:性能預(yù)測(cè)
有各種各樣的方法可以驗(yàn)證你的模型性能,我建議你將訓(xùn)練數(shù)據(jù)集劃分為訓(xùn)練集和驗(yàn)證集(理想的比例是70:30)并且在70%的訓(xùn)練數(shù)據(jù)集上建模。現(xiàn)在,使用30%的驗(yàn)證數(shù)據(jù)集進(jìn)行交叉驗(yàn)證并使用評(píng)價(jià)指標(biāo)進(jìn)行性能評(píng)估。最后需要1到2分鐘執(zhí)行和記錄結(jié)果。
本文的目的不是贏得比賽,而是建立我們自己的基準(zhǔn)。讓我們用python代碼來(lái)執(zhí)行上面的步驟,建立你的第一個(gè)有較高影響的模型。
讓我們開(kāi)始付諸行動(dòng)
首先我假設(shè)你已經(jīng)做了所有的假設(shè)生成并且你擅長(zhǎng)使用python的基本數(shù)據(jù)科學(xué)操作。我用一個(gè)數(shù)據(jù)科學(xué)挑戰(zhàn)的例子來(lái)說(shuō)明。讓我們看一下結(jié)構(gòu):
步驟1:導(dǎo)入所需的庫(kù),讀取測(cè)試和訓(xùn)練數(shù)據(jù)集。
#導(dǎo)入pandas、numpy包,導(dǎo)入LabelEncoder、random、RandomForestClassifier、GradientBoostingClassifier函數(shù)
import pandas as pd
import numpy as np
fromsklearn.preprocessing import LabelEncoder
import random
fromsklearn.ensemble import RandomForestClassifier
from sklearn.ensembleimport GradientBoostingClassifier
#讀取訓(xùn)練、測(cè)試數(shù)據(jù)集
train=pd.read_csv('C:/Users/AnalyticsVidhya/Desktop/challenge/Train.csv')
test=pd.read_csv('C:/Users/AnalyticsVidhya/Desktop/challenge/Test.csv')
#創(chuàng)建訓(xùn)練、測(cè)試數(shù)據(jù)集標(biāo)志
train='Train'
test='Test'
fullData =pd.concat(,axis=0) #聯(lián)合訓(xùn)練、測(cè)試數(shù)據(jù)集
步驟2:該框架的第二步并不需要用到python,繼續(xù)下一步。
步驟3:查看數(shù)據(jù)集的列名或概要
fullData.columns # 顯示所有的列名稱
fullData.head(10) #顯示數(shù)據(jù)框的前10條記錄
fullData.describe() #你可以使用describe()函數(shù)查看數(shù)值域的概要
步驟4:確定a)ID變量 b)目標(biāo)變量 c)分類(lèi)變量 d)數(shù)值變量 e)其他變量。
ID_col =
target_col =
cat_cols =
num_cols= list(set(list(fullData.columns))-set(cat_cols)-set(ID_col)-set(target_col)-set(data_col))
other_col= #為訓(xùn)練、測(cè)試數(shù)據(jù)集設(shè)置標(biāo)識(shí)符
步驟5:識(shí)別缺失值變量并創(chuàng)建標(biāo)志
fullData.isnull().any()#返回True或False,True意味著有缺失值而False相反
num_cat_cols = num_cols+cat_cols # 組合數(shù)值變量和分類(lèi)變量
#為有缺失值的變量創(chuàng)建一個(gè)新的變量
# 對(duì)缺失值標(biāo)志為1,否則為0
for var in num_cat_cols:
if fullData.isnull().any()=True:
fullData=fullData.isnull()*1
步驟6:填補(bǔ)缺失值
#用均值填補(bǔ)數(shù)值缺失值
fullData = fullData.fillna(fullData.mean(),inplace=True)
#用-9999填補(bǔ)分類(lèi)變量缺失值
fullData = fullData.fillna(value = -9999)
步驟7:創(chuàng)建分類(lèi)變量的標(biāo)簽編碼器,將數(shù)據(jù)集分割成訓(xùn)練和測(cè)試集,進(jìn)一步,將訓(xùn)練數(shù)據(jù)集分割成訓(xùn)練集和測(cè)試集。
#創(chuàng)建分類(lèi)特征的標(biāo)簽編碼器
for var in cat_cols:
number = LabelEncoder()
fullData = number.fit_transform(fullData.astype('str'))
#目標(biāo)變量也是分類(lèi)變量,所以也用標(biāo)簽編碼器轉(zhuǎn)換
fullData = number.fit_transform(fullData.astype('str'))
train=fullData='Train']
test=fullData='Test']
train = np.random.uniform(0, 1, len(train)) = .75
Train, Validate = train=True], train=False]
步驟8:將填補(bǔ)和虛假(缺失值標(biāo)志)變量傳遞到模型中,我使用隨機(jī)森林來(lái)預(yù)測(cè)類(lèi)。
features=list(set(list(fullData.columns))-set(ID_col)-set(target_col)-set(other_col))
x_train = Train.values
y_train = Train.values
x_validate = Validate.values
y_validate = Validate.values
x_test=test.values
random.seed(100)
rf = RandomForestClassifier(n_estimators=1000)
rf.fit(x_train, y_train)
步驟9:檢查性能做出預(yù)測(cè)
status = rf.predict_proba(x_validate)
fpr, tpr, _ = roc_curve(y_validate, status)
roc_auc = auc(fpr, tpr)
print roc_auc
final_status = rf.predict_proba(x_test)
test=final_status
test.to_csv('C:/Users/Analytics Vidhya/Desktop/model_output.csv',columns=)
現(xiàn)在可以提交了!
tensorflow添加自定義的auc計(jì)算operator
tensorflow可以很方便的添加用戶自定義的operator(如果不添加也可以采用sklearn的auc計(jì)算函數(shù)或者自己寫(xiě)一個(gè) 但是會(huì)在python執(zhí)行,這里希望在graph中也就是c++端執(zhí)行這個(gè)計(jì)算)
這里根據(jù)工作需要添加一個(gè)計(jì)算auc的operator,只給出最簡(jiǎn)單實(shí)現(xiàn),后續(xù)高級(jí)功能還是參考官方wiki
注意tensorflow現(xiàn)在和最初的官方wiki有變化,原wiki貌似是需要重新bazel編譯整個(gè)tensorflow,然后使用比如tf.user_op.auc這樣。
目前wiki給出的方式=0.6.0版本,采用plug-in的方式,更加靈活可以直接用g++編譯一個(gè)so載入,解耦合,省去了編譯tensorflow過(guò)程,即插即用。
首先auc的operator計(jì)算的文件
tensorflow/core/user_ops/auc.cc
/* Copyright 2015 Google Inc. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==============================================================================*/
// An auc Op.
#include "tensorflow/core/framework/op.h"
#include "tensorflow/core/framework/op_kernel.h"
using namespace tensorflow;
using std::vector;
//@TODO add weight as optional input
REGISTER_OP("Auc")
.Input("predicts: T1")
.Input("labels: T2")
.Output("z: float")
.Attr("T1: {float, double}")
.Attr("T2: {float, double}")
//.Attr("T1: {float, double}")
//.Attr("T2: {int32, int64}")
.SetIsCommutative()
.Doc(R"doc(
Given preidicts and labels output it's auc
)doc");
class AucOp : public OpKernel {
public:
explicit AucOp(OpKernelConstruction* context) : OpKernel(context) {}
templatetypename ValueVec
void index_sort(const ValueVec valueVec, vectorint indexVec)
{
indexVec.resize(valueVec.size());
for (size_t i = 0; i indexVec.size(); i++)
{
indexVec[i] = i;
}
std::sort(indexVec.begin(), indexVec.end(),
[valueVec](const int l, const int r) { return valueVec(l) valueVec(r); });
}
void Compute(OpKernelContext* context) override {
// Grab the input tensor
const Tensor predicts_tensor = context-input(0);
const Tensor labels_tensor = context-input(1);
auto predicts = predicts_tensor.flatfloat(); //輸入能接受float double那么這里如何都處理?
auto labels = labels_tensor.flatfloat();
vectorint indexes;
index_sort(predicts, indexes);
typedef float Float;
Float oldFalsePos = 0;
Float oldTruePos = 0;
Float falsePos = 0;
Float truePos = 0;
Float oldOut = std::numeric_limitsFloat::infinity();
Float result = 0;
for (size_t i = 0; i indexes.size(); i++)
{
int index = indexes[i];
Float label = labels(index);
Float prediction = predicts(index);
Float weight = 1.0;
//Pval3(label, output, weight);
if (prediction != oldOut) //存在相同值得情況是特殊處理的
{
result += 0.5 * (oldTruePos + truePos) * (falsePos - oldFalsePos);
oldOut = prediction;
oldFalsePos = falsePos;
oldTruePos = truePos;
}
if (label 0)
truePos += weight;
else
falsePos += weight;
}
result += 0.5 * (oldTruePos + truePos) * (falsePos - oldFalsePos);
Float AUC = result / (truePos * falsePos);
// Create an output tensor
Tensor* output_tensor = NULL;
TensorShape output_shape;
OP_REQUIRES_OK(context, context-allocate_output(0, output_shape, output_tensor));
output_tensor-scalarfloat()() = AUC;
}
};
REGISTER_KERNEL_BUILDER(Name("Auc").Device(DEVICE_CPU), AucOp);
編譯:
$cat gen-so.sh
TF_INC=$(python -c 'import tensorflow as tf; print(tf.sysconfig.get_include())')
TF_LIB=$(python -c 'import tensorflow as tf; print(tf.sysconfig.get_lib())')
i=$1
o=${i/.cc/.so}
g++ -std=c++11 -shared $i -o $o -I $TF_INC -l tensorflow_framework -L $TF_LIB -fPIC -Wl,-rpath $TF_LIB
$sh gen-so.sh auc.cc
會(huì)生成auc.so
使用的時(shí)候
auc_module = tf.load_op_library('auc.so')
#auc = tf.user_ops.auc #0.6.0之前的tensorflow 自定義op方式
auc = auc_module.auc
evaluate_op = auc(py_x, Y) #py_x is predicts, Y is labels
h2XGBoost參數(shù)調(diào)優(yōu)完全指南(附Python代碼)/h2
譯注:文內(nèi)提供的代碼和運(yùn)行結(jié)果有一定差異,可以從這里完整代碼對(duì)照參考。另外,我自己跟著教程做的時(shí)候,發(fā)現(xiàn)我的庫(kù)無(wú)法解析字符串類(lèi)型的特征,所以只用其中一部分特征做的,具體數(shù)值跟文章中不一樣,反而可以幫助理解文章。所以大家其實(shí)也可以小小修改一下代碼,不一定要完全跟著教程做~ ^0^
需要提前安裝好的庫(kù):簡(jiǎn)介如果你的預(yù)測(cè)模型表現(xiàn)得有些不盡如人意,那就用XGBoost吧。XGBoost算法現(xiàn)在已經(jīng)成為很多數(shù)據(jù)工程師的重要武器。它是一種十分精致的算法,可以處理各種不規(guī)則的數(shù)據(jù)。
構(gòu)造一個(gè)使用XGBoost的模型十分簡(jiǎn)單。但是,提高這個(gè)模型的表現(xiàn)就有些困難(至少我覺(jué)得十分糾結(jié))。這個(gè)算法使用了好幾個(gè)參數(shù)。所以為了提高模型的表現(xiàn),參數(shù)的調(diào)整十分必要。在解決實(shí)際問(wèn)題的時(shí)候,有些問(wèn)題是很難回答的——你需要調(diào)整哪些參數(shù)?這些參數(shù)要調(diào)到什么值,才能達(dá)到理想的輸出?
這篇文章最適合剛剛接觸XGBoost的人閱讀。在這篇文章中,我們會(huì)學(xué)到參數(shù)調(diào)優(yōu)的技巧,以及XGboost相關(guān)的一些有用的知識(shí)。以及,我們會(huì)用Python在一個(gè)數(shù)據(jù)集上實(shí)踐一下這個(gè)算法。你需要知道的XGBoost(eXtreme Gradient Boosting)是Gradient Boosting算法的一個(gè)優(yōu)化的版本。特別鳴謝:我個(gè)人十分感謝Mr Sudalai Rajkumar (aka SRK)大神的支持,目前他在AV Rank中位列第二。如果沒(méi)有他的幫助,就沒(méi)有這篇文章。在他的幫助下,我們才能給無(wú)數(shù)的數(shù)據(jù)科學(xué)家指點(diǎn)迷津。給他一個(gè)大大的贊!內(nèi)容列表1、XGBoost的優(yōu)勢(shì)
2、理解XGBoost的參數(shù)
3、調(diào)整參數(shù)(含示例)1、XGBoost的優(yōu)勢(shì)XGBoost算法可以給預(yù)測(cè)模型帶來(lái)能力的提升。當(dāng)我對(duì)它的表現(xiàn)有更多了解的時(shí)候,當(dāng)我對(duì)它的高準(zhǔn)確率背后的原理有更多了解的時(shí)候,我發(fā)現(xiàn)它具有很多優(yōu)勢(shì):1、正則化標(biāo)準(zhǔn)GBM的實(shí)現(xiàn)沒(méi)有像XGBoost這樣的正則化步驟。正則化對(duì)減少過(guò)擬合也是有幫助的。 實(shí)際上,XGBoost以“正則化提升(regularized boosting)”技術(shù)而聞名。2、并行處理XGBoost可以實(shí)現(xiàn)并行處理,相比GBM有了速度的飛躍。 不過(guò),眾所周知,Boosting算法是順序處理的,它怎么可能并行呢?每一課樹(shù)的構(gòu)造都依賴于前一棵樹(shù),那具體是什么讓我們能用多核處理器去構(gòu)造一個(gè)樹(shù)呢?我希望你理解了這句話的意思。 XGBoost 也支持Hadoop實(shí)現(xiàn)。3、高度的靈活性XGBoost 允許用戶定義自定義優(yōu)化目標(biāo)和評(píng)價(jià)標(biāo)準(zhǔn) 它對(duì)模型增加了一個(gè)全新的維度,所以我們的處理不會(huì)受到任何限制。4、缺失值處理XGBoost內(nèi)置處理缺失值的規(guī)則。 用戶需要提供一個(gè)和其它樣本不同的值,然后把它作為一個(gè)參數(shù)傳進(jìn)去,以此來(lái)作為缺失值的取值。XGBoost在不同節(jié)點(diǎn)遇到缺失值時(shí)采用不同的處理方法,并且會(huì)學(xué)習(xí)未來(lái)遇到缺失值時(shí)的處理方法。5、剪枝當(dāng)分裂時(shí)遇到一個(gè)負(fù)損失時(shí),GBM會(huì)停止分裂。因此GBM實(shí)際上是一個(gè)貪心算法。 XGBoost會(huì)一直分裂到指定的最大深度(max_depth),然后回過(guò)頭來(lái)剪枝。如果某個(gè)節(jié)點(diǎn)之后不再有正值,它會(huì)去除這個(gè)分裂。 這種做法的優(yōu)點(diǎn),當(dāng)一個(gè)負(fù)損失(如-2)后面有個(gè)正損失(如+10)的時(shí)候,就顯現(xiàn)出來(lái)了。GBM會(huì)在-2處停下來(lái),因?yàn)樗龅搅艘粋€(gè)負(fù)值。但是XGBoost會(huì)繼續(xù)分裂,然后發(fā)現(xiàn)這兩個(gè)分裂綜合起來(lái)會(huì)得到+8,因此會(huì)保留這兩個(gè)分裂。6、內(nèi)置交叉驗(yàn)證XGBoost允許在每一輪boosting迭代中使用交叉驗(yàn)證。因此,可以方便地獲得最優(yōu)boosting迭代次數(shù)。 而GBM使用網(wǎng)格搜索,只能檢測(cè)有限個(gè)值。7、在已有的模型基礎(chǔ)上繼續(xù)XGBoost可以在上一輪的結(jié)果上繼續(xù)訓(xùn)練。這個(gè)特性在某些特定的應(yīng)用上是一個(gè)巨大的優(yōu)勢(shì)。 sklearn中的GBM的實(shí)現(xiàn)也有這個(gè)功能,兩種算法在這一點(diǎn)上是一致的。相信你已經(jīng)對(duì)XGBoost強(qiáng)大的功能有了點(diǎn)概念。注意這是我自己總結(jié)出來(lái)的幾點(diǎn),你如果有更多的想法,盡管在下面評(píng)論指出,我會(huì)更新這個(gè)列表的!2、XGBoost的參數(shù)XGBoost的作者把所有的參數(shù)分成了三類(lèi):
1、通用參數(shù):宏觀函數(shù)控制。
2、Booster參數(shù):控制每一步的booster(tree/regression)。
3、學(xué)習(xí)目標(biāo)參數(shù):控制訓(xùn)練目標(biāo)的表現(xiàn)。
在這里我會(huì)類(lèi)比GBM來(lái)講解,所以作為一種基礎(chǔ)知識(shí)。通用參數(shù)這些參數(shù)用來(lái)控制XGBoost的宏觀功能。1、booster[默認(rèn)gbtree]選擇每次迭代的模型,有兩種選擇:
gbtree:基于樹(shù)的模型
gbliner:線性模型2、silent[默認(rèn)0]當(dāng)這個(gè)參數(shù)值為1時(shí),靜默模式開(kāi)啟,不會(huì)輸出任何信息。 一般這個(gè)參數(shù)就保持默認(rèn)的0,因?yàn)檫@樣能幫我們更好地理解模型。3、nthread[默認(rèn)值為最大可能的線程數(shù)]這個(gè)參數(shù)用來(lái)進(jìn)行多線程控制,應(yīng)當(dāng)輸入系統(tǒng)的核數(shù)。 如果你希望使用CPU全部的核,那就不要輸入這個(gè)參數(shù),算法會(huì)自動(dòng)檢測(cè)它。
還有兩個(gè)參數(shù),XGBoost會(huì)自動(dòng)設(shè)置,目前你不用管它。接下來(lái)咱們一起看booster參數(shù)。booster參數(shù)盡管有兩種booster可供選擇,我這里只介紹tree booster,因?yàn)樗谋憩F(xiàn)遠(yuǎn)遠(yuǎn)勝過(guò)linear booster,所以linear booster很少用到。1、eta[默認(rèn)0.3]和GBM中的 learning rate 參數(shù)類(lèi)似。 通過(guò)減少每一步的權(quán)重,可以提高模型的魯棒性。 典型值為0.01-0.2。2、min_child_weight[默認(rèn)1]決定最小葉子節(jié)點(diǎn)樣本權(quán)重和。 和GBM的 min_child_leaf 參數(shù)類(lèi)似,但不完全一樣。XGBoost的這個(gè)參數(shù)是最小樣本權(quán)重的和,而GBM參數(shù)是最小樣本總數(shù)。 這個(gè)參數(shù)用于避免過(guò)擬合。當(dāng)它的值較大時(shí),可以避免模型學(xué)習(xí)到局部的特殊樣本。 但是如果這個(gè)值過(guò)高,會(huì)導(dǎo)致欠擬合。這個(gè)參數(shù)需要使用CV來(lái)調(diào)整。3、max_depth[默認(rèn)6]和GBM中的參數(shù)相同,這個(gè)值為樹(shù)的最大深度。 這個(gè)值也是用來(lái)避免過(guò)擬合的。max_depth越大,模型會(huì)學(xué)到更具體更局部的樣本。 需要使用CV函數(shù)來(lái)進(jìn)行調(diào)優(yōu)。 典型值:3-104、max_leaf_nodes樹(shù)上最大的節(jié)點(diǎn)或葉子的數(shù)量。 可以替代max_depth的作用。因?yàn)槿绻傻氖嵌鏄?shù),一個(gè)深度為n的樹(shù)最多生成n2個(gè)葉子。 如果定義了這個(gè)參數(shù),GBM會(huì)忽略max_depth參數(shù)。5、gamma[默認(rèn)0]在節(jié)點(diǎn)分裂時(shí),只有分裂后損失函數(shù)的值下降了,才會(huì)分裂這個(gè)節(jié)點(diǎn)。Gamma指定了節(jié)點(diǎn)分裂所需的最小損失函數(shù)下降值。 這個(gè)參數(shù)的值越大,算法越保守。這個(gè)參數(shù)的值和損失函數(shù)息息相關(guān),所以是需要調(diào)整的。6、max_delta_step[默認(rèn)0]這參數(shù)限制每棵樹(shù)權(quán)重改變的最大步長(zhǎng)。如果這個(gè)參數(shù)的值為0,那就意味著沒(méi)有約束。如果它被賦予了某個(gè)正值,那么它會(huì)讓這個(gè)算法更加保守。 通常,這個(gè)參數(shù)不需要設(shè)置。但是當(dāng)各類(lèi)別的樣本十分不平衡時(shí),它對(duì)邏輯回歸是很有幫助的。 這個(gè)參數(shù)一般用不到,但是你可以挖掘出來(lái)它更多的用處。7、subsample[默認(rèn)1]和GBM中的subsample參數(shù)一模一樣。這個(gè)參數(shù)控制對(duì)于每棵樹(shù),隨機(jī)采樣的比例。 減小這個(gè)參數(shù)的值,算法會(huì)更加保守,避免過(guò)擬合。但是,如果這個(gè)值設(shè)置得過(guò)小,它可能會(huì)導(dǎo)致欠擬合。 典型值:0.5-18、colsample_bytree[默認(rèn)1]和GBM里面的max_features參數(shù)類(lèi)似。用來(lái)控制每棵隨機(jī)采樣的列數(shù)的占比(每一列是一個(gè)特征)。 典型值:0.5-19、colsample_bylevel[默認(rèn)1]用來(lái)控制樹(shù)的每一級(jí)的每一次分裂,對(duì)列數(shù)的采樣的占比。 我個(gè)人一般不太用這個(gè)參數(shù),因?yàn)閟ubsample參數(shù)和colsample_bytree參數(shù)可以起到相同的作用。但是如果感興趣,可以挖掘這個(gè)參數(shù)更多的用處。10、lambda[默認(rèn)1]權(quán)重的L2正則化項(xiàng)。(和Ridge regression類(lèi)似)。 這個(gè)參數(shù)是用來(lái)控制XGBoost的正則化部分的。雖然大部分?jǐn)?shù)據(jù)科學(xué)家很少用到這個(gè)參數(shù),但是這個(gè)參數(shù)在減少過(guò)擬合上還是可以挖掘出更多用處的。11、alpha[默認(rèn)1]權(quán)重的L1正則化項(xiàng)。(和Lasso regression類(lèi)似)。 可以應(yīng)用在很高維度的情況下,使得算法的速度更快。12、scale_pos_weight[默認(rèn)1]在各類(lèi)別樣本十分不平衡時(shí),把這個(gè)參數(shù)設(shè)定為一個(gè)正值,可以使算法更快收斂。學(xué)習(xí)目標(biāo)參數(shù)這個(gè)參數(shù)用來(lái)控制理想的優(yōu)化目標(biāo)和每一步結(jié)果的度量方法。1、objective[默認(rèn)reg:linear]這個(gè)參數(shù)定義需要被最小化的損失函數(shù)。最常用的值有:
binary:logistic 二分類(lèi)的邏輯回歸,返回預(yù)測(cè)的概率(不是類(lèi)別)。 multi:softmax 使用softmax的多分類(lèi)器,返回預(yù)測(cè)的類(lèi)別(不是概率)。
在這種情況下,你還需要多設(shè)一個(gè)參數(shù):num_class(類(lèi)別數(shù)目)。 multi:softprob 和multi:softmax參數(shù)一樣,但是返回的是每個(gè)數(shù)據(jù)屬于各個(gè)類(lèi)別的概率。2、eval_metric[默認(rèn)值取決于objective參數(shù)的取值]對(duì)于有效數(shù)據(jù)的度量方法。 對(duì)于回歸問(wèn)題,默認(rèn)值是rmse,對(duì)于分類(lèi)問(wèn)題,默認(rèn)值是error。 典型值有:
rmse 均方根誤差(∑Ni=1?2N??????√) mae 平均絕對(duì)誤差(∑Ni=1|?|N) logloss 負(fù)對(duì)數(shù)似然函數(shù)值 error 二分類(lèi)錯(cuò)誤率(閾值為0.5) merror 多分類(lèi)錯(cuò)誤率 mlogloss 多分類(lèi)logloss損失函數(shù) auc 曲線下面積3、seed(默認(rèn)0)隨機(jī)數(shù)的種子 設(shè)置它可以復(fù)現(xiàn)隨機(jī)數(shù)據(jù)的結(jié)果,也可以用于調(diào)整參數(shù)如果你之前用的是Scikit-learn,你可能不太熟悉這些參數(shù)。但是有個(gè)好消息,python的XGBoost模塊有一個(gè)sklearn包,XGBClassifier。這個(gè)包中的參數(shù)是按sklearn風(fēng)格命名的。會(huì)改變的函數(shù)名是:
1、eta -learning_rate
2、lambda-reg_lambda
3、alpha-reg_alpha
你肯定在疑惑為啥咱們沒(méi)有介紹和GBM中的’n_estimators’類(lèi)似的參數(shù)。XGBClassifier中確實(shí)有一個(gè)類(lèi)似的參數(shù),但是,是在標(biāo)準(zhǔn)XGBoost實(shí)現(xiàn)中調(diào)用擬合函數(shù)時(shí),把它作為’num_boosting_rounds’參數(shù)傳入。調(diào)整參數(shù)(含示例)我已經(jīng)對(duì)這些數(shù)據(jù)進(jìn)行了一些處理:City變量,因?yàn)轭?lèi)別太多,所以刪掉了一些類(lèi)別。 DOB變量換算成年齡,并刪除了一些數(shù)據(jù)。 增加了 EMI_Loan_Submitted_Missing 變量。如果EMI_Loan_Submitted變量的數(shù)據(jù)缺失,則這個(gè)參數(shù)的值為1。否則為0。刪除了原先的EMI_Loan_Submitted變量。 EmployerName變量,因?yàn)轭?lèi)別太多,所以刪掉了一些類(lèi)別。 因?yàn)镋xisting_EMI變量只有111個(gè)值缺失,所以缺失值補(bǔ)充為中位數(shù)0。 增加了 Interest_Rate_Missing 變量。如果Interest_Rate變量的數(shù)據(jù)缺失,則這個(gè)參數(shù)的值為1。否則為0。刪除了原先的Interest_Rate變量。 刪除了Lead_Creation_Date,從直覺(jué)上這個(gè)特征就對(duì)最終結(jié)果沒(méi)什么幫助。 Loan_Amount_Applied, Loan_Tenure_Applied 兩個(gè)變量的缺項(xiàng)用中位數(shù)補(bǔ)足。 增加了 Loan_Amount_Submitted_Missing 變量。如果Loan_Amount_Submitted變量的數(shù)據(jù)缺失,則這個(gè)參數(shù)的值為1。否則為0。刪除了原先的Loan_Amount_Submitted變量。 增加了 Loan_Tenure_Submitted_Missing 變量。如果 Loan_Tenure_Submitted 變量的數(shù)據(jù)缺失,則這個(gè)參數(shù)的值為1。否則為0。刪除了原先的 Loan_Tenure_Submitted 變量。 刪除了LoggedIn, Salary_Account 兩個(gè)變量 增加了 Processing_Fee_Missing 變量。如果 Processing_Fee 變量的數(shù)據(jù)缺失,則這個(gè)參數(shù)的值為1。否則為0。刪除了原先的 Processing_Fee 變量。 Source前兩位不變,其它分成不同的類(lèi)別。 進(jìn)行了量化和獨(dú)熱編碼(一位有效編碼)。如果你有原始數(shù)據(jù),可以從資源庫(kù)里面data_preparation的Ipython notebook 文件,然后自己過(guò)一遍這些步驟。首先,import必要的庫(kù),然后加載數(shù)據(jù)。#Import libraries:
import pandas as pd
import numpy as np
import xgboost as xgb
from xgboost.sklearn import XGBClassifier
from sklearn import cross_validation, metrics ? #Additional ? ? scklearn functions
from sklearn.grid_search import GridSearchCV ? #Perforing grid search
import matplotlib.pylab as plt
%matplotlib inline
from matplotlib.pylab import rcParams
rcParams['figure.figsize'] = 12, 4
train = pd.read_csv('train_modified.csv')
target = 'Disbursed'
IDcol = 'ID'
注意我import了兩種XGBoost:xgb - 直接引用xgboost。接下來(lái)會(huì)用到其中的“cv”函數(shù)。 XGBClassifier - 是xgboost的sklearn包。這個(gè)包允許我們像GBM一樣使用Grid Search 和并行處理。在向下進(jìn)行之前,我們先定義一個(gè)函數(shù),它可以幫助我們建立XGBoost models 并進(jìn)行交叉驗(yàn)證。好消息是你可以直接用下面的函數(shù),以后再自己的models中也可以使用它。def modelfit(alg, dtrain, predictors,useTrainCV=True, cv_folds=5, early_stopping_rounds=50):
if useTrainCV:
xgb_param = alg.get_xgb_params()
xgtrain = xgb.DMatrix(dtrain[predictors].values, label=dtrain[target].values)
cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_params()['n_estimators'], nfold=cv_folds,
metrics='auc', early_stopping_rounds=early_stopping_rounds, show_progress=False)
alg.set_params(n_estimators=cvresult.shape[0])
#Fit the algorithm on the data
alg.fit(dtrain[predictors], dtrain['Disbursed'],eval_metric='auc')
#Predict training set:
dtrain_predictions = alg.predict(dtrain[predictors])
dtrain_predprob = alg.predict_proba(dtrain[predictors])[:,1]
#Print model report:
print "\nModel Report"
print "Accuracy : %.4g" % metrics.accuracy_score(dtrain['Disbursed'].values, dtrain_predictions)
print "AUC Score (Train): %f" % metrics.roc_auc_score(dtrain['Disbursed'], dtrain_predprob)
feat_imp = pd.Series(alg.booster().get_fscore()).sort_values(ascending=False)
feat_imp.plot(kind='bar', title='Feature Importances')
plt.ylabel('Feature Importance Score')
這個(gè)函數(shù)和GBM中使用的有些許不同。不過(guò)本文章的重點(diǎn)是講解重要的概念,而不是寫(xiě)代碼。如果哪里有不理解的地方,請(qǐng)?jiān)谙旅嬖u(píng)論,不要有壓力。注意xgboost的sklearn包沒(méi)有“feature_importance”這個(gè)量度,但是get_fscore()函數(shù)有相同的功能。參數(shù)調(diào)優(yōu)的一般方法。我們會(huì)使用和GBM中相似的方法。需要進(jìn)行如下步驟:
選擇較高的學(xué)習(xí)速率(learning rate)。一般情況下,學(xué)習(xí)速率的值為0.1。但是,對(duì)于不同的問(wèn)題,理想的學(xué)習(xí)速率有時(shí)候會(huì)在0.05到0.3之間波動(dòng)。選擇對(duì)應(yīng)于此學(xué)習(xí)速率的理想決策樹(shù)數(shù)量。XGBoost有一個(gè)很有用的函數(shù)“cv”,這個(gè)函數(shù)可以在每一次迭代中使用交叉驗(yàn)證,并返回理想的決策樹(shù)數(shù)量。
2. 對(duì)于給定的學(xué)習(xí)速率和決策樹(shù)數(shù)量,進(jìn)行決策樹(shù)特定參數(shù)調(diào)優(yōu)(max_depth, min_child_weight, gamma, subsample, colsample_bytree)。在確定一棵樹(shù)的過(guò)程中,我們可以選擇不同的參數(shù),待會(huì)兒我會(huì)舉例說(shuō)明。
3. xgboost的正則化參數(shù)的調(diào)優(yōu)。(lambda, alpha)。這些參數(shù)可以降低模型的復(fù)雜度,從而提高模型的表現(xiàn)。
4. 降低學(xué)習(xí)速率,確定理想?yún)?shù)。咱們一起詳細(xì)地一步步進(jìn)行這些操作。第一步:確定學(xué)習(xí)速率和tree_based 參數(shù)調(diào)優(yōu)的估計(jì)器數(shù)目。為了確定boosting 參數(shù),我們要先給其它參數(shù)一個(gè)初始值。咱們先按如下方法取值:
1、max_depth = 5 :這個(gè)參數(shù)的取值最好在3-10之間。我選的起始值為5,但是你也可以選擇其它的值。起始值在4-6之間都是不錯(cuò)的選擇。
2、min_child_weight = 1:在這里選了一個(gè)比較小的值,因?yàn)檫@是一個(gè)極不平衡的分類(lèi)問(wèn)題。因此,某些葉子節(jié)點(diǎn)下的值會(huì)比較小。
3、gamma = 0: 起始值也可以選其它比較小的值,在0.1到0.2之間就可以。這個(gè)參數(shù)后繼也是要調(diào)整的。
4、subsample,colsample_bytree = 0.8: 這個(gè)是最常見(jiàn)的初始值了。典型值的范圍在0.5-0.9之間。
5、scale_pos_weight = 1: 這個(gè)值是因?yàn)轭?lèi)別十分不平衡。
注意哦,上面這些參數(shù)的值只是一個(gè)初始的估計(jì)值,后繼需要調(diào)優(yōu)。這里把學(xué)習(xí)速率就設(shè)成默認(rèn)的0.1。然后用xgboost中的cv函數(shù)來(lái)確定最佳的決策樹(shù)數(shù)量。前文中的函數(shù)可以完成這個(gè)工作。#Choose all predictors except target ?IDcols
predictors = [x for x in train.columns if x not in [target,IDcol]]
xgb1 = XGBClassifier(
learning_rate =0.1,
n_estimators=1000,
max_depth=5,
min_child_weight=1,
gamma=0,
subsample=0.8,
colsample_bytree=0.8,
objective= 'binary:logistic',
nthread=4,
scale_pos_weight=1,
seed=27)
modelfit(xgb1, train, predictors)
從輸出結(jié)果可以看出,在學(xué)習(xí)速率為0.1時(shí),理想的決策樹(shù)數(shù)目是140。這個(gè)數(shù)字對(duì)你而言可能比較高,當(dāng)然這也取決于你的系統(tǒng)的性能。注意:在AUC(test)這里你可以看到測(cè)試集的AUC值。但是如果你在自己的系統(tǒng)上運(yùn)行這些命令,并不會(huì)出現(xiàn)這個(gè)值。因?yàn)閿?shù)據(jù)并不公開(kāi)。這里提供的值僅供參考。生成這個(gè)值的代碼部分已經(jīng)被刪掉了。喎?"/kf/ware/vc/" target="_blank" class="keylink"vcD4NCjwvYmxvY2txdW90ZT4NCjxoMSBpZD0="第二步-maxdepth-和-minweight-參數(shù)調(diào)優(yōu)"第二步: max_depth 和 min_weight 參數(shù)調(diào)優(yōu)我們先對(duì)這兩個(gè)參數(shù)調(diào)優(yōu),是因?yàn)樗鼈儗?duì)最終結(jié)果有很大的影響。首先,我們先大范圍地粗調(diào)參數(shù),然后再小范圍地微調(diào)。
注意:在這一節(jié)我會(huì)進(jìn)行高負(fù)荷的柵格搜索(grid search),這個(gè)過(guò)程大約需要15-30分鐘甚至更久,具體取決于你系統(tǒng)的性能。你也可以根據(jù)自己系統(tǒng)的性能選擇不同的值。param_test1 = {
'max_depth':range(3,10,2),
'min_child_weight':range(1,6,2)
}
gsearch1 = GridSearchCV(estimator = XGBClassifier( ? ? ? ? learning_rate =0.1, n_estimators=140, max_depth=5,
min_child_weight=1, gamma=0, subsample=0.8, ? ? ? ? ? ? colsample_bytree=0.8,
objective= 'binary:logistic', nthread=4, ? ? scale_pos_weight=1, seed=27),
param_grid = param_test1, ? ? scoring='roc_auc',n_jobs=4,iid=False, cv=5)
gsearch1.fit(train[predictors],train[target])
gsearch1.grid_scores_, gsearch1.best_params_, ? ? gsearch1.best_score_
當(dāng)前標(biāo)題:auc函數(shù)python auc函數(shù)可以用于無(wú)監(jiān)督么
轉(zhuǎn)載注明:http://chinadenli.net/article12/hghegc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、網(wǎng)站排名、服務(wù)器托管、移動(dòng)網(wǎng)站建設(shè)、微信公眾號(hào)、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)