如何通过所有变量创建几个机器学习模型,并在每次迭代后使用Python中的1个较少变量创建下一个XGBClassifier?

mfpqipee  于 2023-01-29  发布在  Python
关注(0)|答案(1)|浏览(112)

我在Python Pandas中有DataFrame,如下所示:

    • 输入数据:**
  • Y-二进制目标
  • X1...X5-预测因子

| 是|X1|X2|X3|X4|X5|
| - ------|- ------|- ------|- ------|- ------|- ------|
| 1个|一百一十一|二十二|1个|无|一百五十|
| 无|十二|三十三|1个|无|二百二十二|
| 1个|一百五十|四十四|无|无|二百三十|
| 无|二百七十|五十五|无|1个|五百|
| ...|...|...|...|...|...|

    • 要求:**我需要:
  • 通过所有变量运行循环,使得在每次迭代之后创建新的XGBoost分类模型,并且还在每次迭代之后丢弃变量之一并创建下一模型
  • 因此,如果我具有例如5个预测因子(X1...X5),我需要创建5个XGBoost分类模型,并且在每个连续模型中必须少1个变量
  • 每个模型应通过roc_auc_score进行评估
  • 作为输出,我需要:list_of_models = [],其中将保存创建的模型和数据框,以及列车和测试的AUC
    • 所需产出:**

因此,我需要以下内容

  • 模型-模型列表中模型的位置
  • Num_var-模型中使用的预测变量数
  • AUC_train-训练数据集上的roc_auc_评分
  • AUC_test-检验数据集上的roc_auc_评分

| 型号|变量编号|AUC_列车|AUC_试验|
| - ------|- ------|- ------|- ------|
| 无|五个|0.887|0.884|
| 1个|四个|0.875|0.845|
| 第二章|三个|0.854|0.843|
| 三个|第二章|0.965|零点九二八|
| 四个|1个|0.922|零点九二一|

    • 我的草稿:**这是错误的,因为它应该循环通过所有变量,每次迭代后创建一个新的XGBoost分类模型,并且每次迭代后丢弃一个变量并创建下一个模型
X_train, X_test, y_train, y_test = train_test_split(df.drop("Y", axis=1)
                                                    , df.Y
                                                    , train_size = 0.70
                                                    , test_size=0.30
                                                    , random_state=1
                                                    , stratify = df.Y)

results = []
list_of_models = []

for val in X_train:

    model = XGBClassifier()
    model.fit(X_train, y_train)
    list_of_models.append(model)

    preds_train = model.predict(X_train)
    preds_test = model.predict(X_test)
    preds_prob_train = model.predict_proba(X_train)[:,1]
    preds_prob_test = model.predict_proba(X_test)[:,1]

    results.append({("AUC_train":round(metrics.roc_auc_score(y_train,preds_prod_test),3),
                     "AUC_test":round(metrics.roc_auc_score(y_test,preds_prod_test),3})

results = pd.DataFrame(results)

在Python中如何实现这一点?

62lalag4

62lalag41#

你想让你的数据在每个循环中变窄吗?如果我理解正确的话,你可以这样做:

results = []
list_of_models = []

for i in X_train.columns:
    model = XGBClassifier()
    model.fit(X_train, y_train)
    list_of_models.append(model)

    preds_train = model.predict(X_train)
    preds_test = model.predict(X_test)
    preds_prob_train = model.predict_proba(X_train)[:,1]
    preds_prob_test = model.predict_proba(X_test)[:,1]
    results.append({("AUC_train":round(metrics.roc_auc_score(y_train,preds_prod_test),3),
                 "AUC_test":round(metrics.roc_auc_score(y_test,preds_prod_test),3})
    X_train = X_train.drop(i, axis=1)
    X_test = X_test.drop(i, axis=1)

results = pd.DataFrame(results)

相关问题