【问题标题】:python regression: predicting model with new datapython回归:用新数据预测模型
【发布时间】:2021-07-08 08:48:07
【问题描述】:

我正在尝试使用新数据来预测新结果,但是,我正在处理以下错误:

ValueError: feature_names mismatch: ['time', 'x', 'y'] ['f0', 'f1', 'f2'] 预期 x, time, y 在输入数据训练数据中没有 以下字段:f0、f1、f2

我不明白为什么,因为我有 3 个预测变量,而且我在数组中正好使用了 3 个值。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
import xgboost as xgb
import datetime
import seaborn as sns
from numpy import asarray

data=[[1, 1,2 ,5],
        [2, 5,5,6],
        [3, 4,6,6]
        ,[5, 6,5,6],
        [7,9,9,7],
        [8, 7,9,4]
        ,[9, 2,3,8],
        [2, 5,1,9],
        [2,2,10,9]
        ,[3, 8,2,8],
        [6, 5,4,10],
        [6, 8,5 ,10]]
df = pd.DataFrame(data, columns=['time','x','y','target'])
xgb_reg=xgb.XGBRegressor( n_estimators= 30, max_depth=8, eta= 0.1, colsample_bytree= 0.4, subsample= 0.4) #(n_estimators=250, max_depth=15, eta=0.1, subsample=0.4, colsample_bytree=0.4)
y = (df.target)
X=df.drop(['target'], axis = 1)
print('========1=============')
model=xgb_reg.fit(X,y)
prediction=model.predict(X)
new_data=[[10,10,10]]
new_data_asarray=asarray(new_data)
pred=model.predict(new_data_asarray)
print(pred)

【问题讨论】:

    标签: python pandas machine-learning prediction


    【解决方案1】:

    这是因为您的模型需要一个 pandas 数据框作为输入。

    在训练之前将您的 X 数据帧简单地转换为一个 numpy 数组,如下所示。

    import numpy as np
    import pandas as pd
    import xgboost as xgb
    
    
    data = [
        [1, 1, 2, 5],
        [2, 5, 5, 6],
        [3, 4, 6, 6],
        [5, 6, 5, 6],
        [7, 9, 9, 7],
        [8, 7, 9, 4],
        [9, 2, 3, 8],
        [2, 5, 1, 9],
        [2, 2, 10, 9],
        [3, 8, 2, 8],
        [6, 5, 4, 10],
        [6, 8, 5, 10],
    ]
    df = pd.DataFrame(data, columns=["time", "x", "y", "target"])
    xgb_reg = xgb.XGBRegressor(
        n_estimators=30, max_depth=8, eta=0.1, colsample_bytree=0.4, subsample=0.4
    )  # (n_estimators=250, max_depth=15, eta=0.1, subsample=0.4, colsample_bytree=0.4)
    y = df.target
    X = df.drop(["target"], axis=1)
    
    X = X.to_numpy()
    
    print("========1=============")
    model = xgb_reg.fit(X, y)
    prediction = model.predict(X)
    new_data = [[10, 10, 10]]
    new_data_asarray = np.asarray(new_data)
    pred = model.predict(new_data_asarray)
    print(pred)
    

    【讨论】:

      【解决方案2】:

      xgb 需要相同的type 数据用于训练和测试。由于您使用 pandas 数据框进行训练,但在预测中给出了一个 numpy 数组,因此会出现错误。 (此外,它会尝试使用默认列名f* 从该数组中创建一个数据框,如错误所示)。

      因此,解决方法是将预测中使用的数组转换为一个帧,其列名取自训练 X 数据帧:

      new_data = [[10,10,10]]
      new_data_as_frame = pd.DataFrame(new_data, columns=X.columns)
      pred = model.predict(new_data_as_frame)
      

      【讨论】:

      • 谢谢,但现在还有一个问题。假设我想预测“时间”的不同值的结果,从 20 到 30,i in range(20,30) 的以下行: new_data=[[i,10,10]] new_df=pd.DataFrame (new_data, columns=X.columns) pred=model.predict(new_df) print(pred) 打印出相同的精确值。是不是很奇怪?
      • @d8a988 这是一个机器学习问题。您有 12 个训练数据样本,似乎不足以让模型区分不同的 time 特征一旦其他 2 个固定为 10。
      • 即,这是一个基于树的模型,其中包含 30 棵顺序树。当给定一对固定的[10, 10] 和x, y 时,似乎time 功能在树中的分支中没有发挥重要作用,无论time 如何,这都会导致相同的路径。
      • 但是为了使其他两个变量根据“时间”发生变化,最好的策略是什么?
      • 更多数据?不同的参数?不同的算法?
      【解决方案3】:

      当我将输入作为数据框提供时,具有指定的列名,它可以工作。

      model = xgb_reg.fit(X, y)
      prediction = model.predict(X)
      new_data = [[10, 10, 10]]
      new_data = pd.DataFrame(new_data, columns=['time', 'x', 'y'])
      pred = model.predict(new_data)
      print(pred)  # [6.3624153]
      

      【讨论】:

      • 如果我将“时间”输入更改为任意数字,结果仍然是您预测的结果。怎么会这样?是不是很奇怪?
      • 不完全是。我做了一个 for 循环 for i in range(100) 来替换 time 列并执行 100 次预测。我得到 [6.298867] [6.298867] [6.9000916] [6.8208203] [6.8208203] [7.0572853] [7.0842357] ....
      猜你喜欢
      • 2020-06-07
      • 2014-09-11
      • 1970-01-01
      • 2019-01-10
      • 2021-07-22
      • 2021-02-25
      • 1970-01-01
      • 1970-01-01
      • 2016-06-02
      相关资源
      最近更新 更多