卧槽,本來猜GBDT獲取的組合特征,需要自己去解析GBDT的樹,scikit learn里面竟然直接調用apply函數就可以了
# 弱分類器的數目 n_estimator = 10 # 隨機生成分類數據。 X, y = make_classification(n_samples=80000) # 切分為測試集和訓練集,比例0.5 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5) # 將訓練集切分為兩部分,一部分用於訓練GBDT模型,另一部分輸入到訓練好的GBDT模型生成GBDT特征,然后作為LR的特征。這樣分成兩部分是為了防止過擬合。 X_train, X_train_lr, y_train, y_train_lr = train_test_split(X_train, y_train, test_size=0.5) # 調用GBDT分類模型。 grd = GradientBoostingClassifier(n_estimators=n_estimator) # 調用one-hot編碼。 grd_enc = OneHotEncoder() # 調用LR分類模型。 grd_lm = LogisticRegression() '''使用X_train訓練GBDT模型,后面用此模型構造特征''' grd.fit(X_train, y_train) # fit one-hot編碼器 grd_enc.fit(grd.apply(X_train)[:, :, 0]) ''' 使用訓練好的GBDT模型構建特征,然后將特征經過one-hot編碼作為新的特征輸入到LR模型訓練。 ''' grd_lm.fit(grd_enc.transform(grd.apply(X_train_lr)[:, :, 0]), y_train_lr) # 用訓練好的LR模型多X_test做預測 y_pred_grd_lm = grd_lm.predict_proba(grd_enc.transform(grd.apply(X_test)[:, :, 0]))[:, 1] # 根據預測結果輸出 fpr_grd_lm, tpr_grd_lm, _ = roc_curve(y_test, y_pred_grd_lm)