【问题标题】:Do I have to cut y (prediction) column from Pandas dataframe with Scikit-learn?我是否必须使用 Scikit-learn 从 Pandas 数据框中剪切 y(预测)列?
【发布时间】:2020-06-23 19:31:49
【问题描述】:

我已将我的 Pandas DataFrame 拆分为 train_Xtrain_y 部分,其中 train_X 包含所有 N 列,train_y 只有第 N 列,描述了我想要预测的变量。目前我正在做:

train_X.drop("N-th column name", axis=1, inplace=True)
model = SomeSklearnModel()
model.fit(train_X, train_y)

我是否必须“手动”完成(即在 train_X 上使用 drop()),或者我可以只做第 3 行,Scikit-learn 将“知道”哪一列 train_y 是而不是使用它用于模型训练(仅用于检查结果)?

【问题讨论】:

  • 我建议使用 sklearns train_test_split,但是要回答您的问题,是的,您必须删除答案栏。
  • @BenPap 我已经用它拆分了我的数据,是的。但 AFAIK 它不会影响列,这是我在这里主要关心的问题。
  • 通常在train_test_split 之前,您可以执行y = X.pop('nth column name') - pop 删除并返回分配的列值
  • @ChrisA 但这与我的方法有什么不同吗?我的意思是,我仍然必须手动完成。当我将它用于多个模型时,这是一件有用的事情,但它很有用。
  • 是的,无论您采用哪种方式,您都需要明确声明 Xy

标签: python pandas scikit-learn


【解决方案1】:

sklearn 估计器上调用 fit 时,您必须明确声明 Xy。通常,当您准备好将数据拆分为训练集和测试集时,X 应仅包含模型特征,因此不应包含您的目标 y
有很多方法可以做到这一点,但这里有两种常用的方法,以 iris 数据集为例:

# Setup
df_iris = pd.DataFrame({'sepal_length': [5.0, 4.8, 5.8, 5.7, 4.5, 6.0, 6.3, 4.8, 5.6, 6.4],
                        'sepal_width': [3.2, 3.4, 2.8, 4.4, 2.3, 3.0, 2.5, 3.4, 3.0, 2.8],
                        'petal_length': [1.2, 1.6, 5.1, 1.5, 1.3, 4.8, 5.0, 1.9, 4.5, 5.6],
                        'petal_width': [0.2, 0.2, 2.4, 0.4, 0.3, 1.8, 1.9, 0.2, 1.5, 2.1],
                        'target': ['setosa', 'setosa', 'virginica', 'setosa', 'setosa','virginica',
                                   'virginica', 'setosa', 'versicolor', 'virginica']})

如果你的目标y是“n”的第n列,可以使用iloc切片:

X = df_iris.iloc[:, :-1]
y = df_iris.iloc[:, -1]

另一种方法是使用pop,它会删除并返回分配列:

X = df_iris.copy()
y = X.pop('target')

或者使用你自己的方法drop

X = df_iris.drop('target', axis=1)
y = df_iris['target']

【讨论】:

    猜你喜欢
    • 2017-05-07
    • 2016-04-01
    • 2015-05-24
    • 2023-03-09
    • 2016-02-09
    • 2016-10-29
    • 2021-07-21
    • 2013-11-30
    • 2021-05-25
    相关资源
    最近更新 更多