原文地址:https://finthon.com/python-gbdt-prediction/
-- 全文閱讀3分鐘 --
在本文中,你將學習到以下內(nèi)容:
- GBDT算法實現(xiàn)
- 模型保存
- 模型加載及預測
前言
GBDT屬于Boosting算法者填,它是利用損失函數(shù)的負梯度方向在當前模型的值作為殘差的近似值谣殊,進而擬合一棵CART回歸樹。GBDT的會累加所有樹的結(jié)果柜某,而這種累加是無法通過分類完成的,因此GBDT的樹都是CART回歸樹,而不是分類樹(盡管GBDT調(diào)整后也可以用于分類但不代表GBDT的樹為分類樹)绘搞。本文就是利用GBDT算法實現(xiàn)一個例子。
數(shù)據(jù)說明
新能源汽車充電樁的故障檢測問題傅物,提供85500條訓練數(shù)據(jù)(標簽:0代表充電樁正常夯辖,1代表充電樁有故障),參賽者需對36644條測試數(shù)據(jù)進行預測董饰。
訓練數(shù)據(jù)
數(shù)據(jù)文件:data_train.csv
字段說明:
測試數(shù)據(jù)
數(shù)據(jù)文件:data_test.csv
字段說明:
GBDT算法
導入所需庫:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.externals import joblib
通過pandas讀取csv文件蒿褂,GDBT算法直接從sklearn.ensemble調(diào)用,導入joblib函數(shù)保存模型卒暂。
接著讀取文件,去除id和label標簽項啄栓,并把數(shù)據(jù)分成訓練集和驗證集:
data = pd.read_csv(r"./data_train.csv")
x_columns = []
for x in data.columns:
if x not in ['id', 'label']:
x_columns.append(x)
X = data[x_columns]
y = data['label']
x_train, x_test, y_train, y_test = train_test_split(X, y)
這里采用默認劃分比例,即75%數(shù)據(jù)作為訓練集也祠,25%作為預測集昙楚。
接下來調(diào)用GBDT算法:
# 模型訓練,使用GBDT算法
gbr = GradientBoostingClassifier(n_estimators=3000, max_depth=2, min_samples_split=2, learning_rate=0.1)
gbr.fit(x_train, y_train.ravel())
joblib.dump(gbr, 'train_model_result4.m') # 保存模型
GBDT算法參數(shù)設(shè)置如上诈嘿,也可以通過網(wǎng)格搜索尋找最優(yōu)參數(shù)設(shè)置堪旧,這里不贅述。模型train_model_result4.m保存在當前目錄下奖亚。
最后我們打印訓練和驗證的準確率:
y_gbr = gbr.predict(x_train)
y_gbr1 = gbr.predict(x_test)
acc_train = gbr.score(x_train, y_train)
acc_test = gbr.score(x_test, y_test)
print(acc_train)
print(acc_test)
我們的模型對于訓練和預測都達到了100%的準確率:
完整代碼如下:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.externals import joblib
data = pd.read_csv(r"./data_train.csv")
x_columns = []
for x in data.columns:
if x not in ['id', 'label']:
x_columns.append(x)
X = data[x_columns]
y = data['label']
x_train, x_test, y_train, y_test = train_test_split(X, y)
# 模型訓練崎场,使用GBDT算法
gbr = GradientBoostingClassifier(n_estimators=3000, max_depth=2, min_samples_split=2, learning_rate=0.1)
gbr.fit(x_train, y_train.ravel())
joblib.dump(gbr, 'train_model_result4.m') # 保存模型
y_gbr = gbr.predict(x_train)
y_gbr1 = gbr.predict(x_test)
acc_train = gbr.score(x_train, y_train)
acc_test = gbr.score(x_test, y_test)
print(acc_train)
print(acc_test)
模型預測
在訓練和驗證集上,我們的模型都達到了100%的準確率遂蛀,接下來用模型預測測試集的結(jié)果谭跨。
代碼如下:
import numpy as np
import pandas as pd
from sklearn.externals import joblib
# 加載模型并預測
gbr = joblib.load('train_model_result4.m') # 加載模型
test_data = pd.read_csv(r"./data_test.csv")
testx_columns = []
for xx in test_data.columns:
if xx not in ['id', 'label']:
testx_columns.append(xx)
test_x = test_data[testx_columns]
test_y = gbr.predict(test_x)
test_y = np.reshape(test_y, (36644, 1))
# 保存預測結(jié)果
df = pd.DataFrame()
df['id'] = test_data['id']
df['label'] = test_y
df.to_csv("./data_predict.csv", header=None, index=None)
最終我們將結(jié)果保存在data_predict.csv提交比賽作業(yè)。該結(jié)果準確率100%。
我們通過一個具體的項目實現(xiàn)GBDT算法的訓練及預測過程螃宙,本文所需資料我都放在這里蛮瞄, 密碼:47v5,希望對你們有幫助谆扎。