TypeError:train_test_split() 只有当我在函数中写入参数'test_size'时才获得多个值

Posted

技术标签:

【中文标题】TypeError:train_test_split() 只有当我在函数中写入参数\'test_size\'时才获得多个值【英文标题】:TypeError: train_test_split() got multiple values for argument 'test_size' only when I write it in a functionTypeError:train_test_split() 只有当我在函数中写入参数'test_size'时才获得多个值 【发布时间】:2022-01-07 19:59:30 【问题描述】:

对于如下所示的数据框df_content

rated_object     feature_1    feature_2    feature_n    rating
o1               2.02         0            90.40        0
o2               3.70         1            NaN          1
o3               3.45         0            70.50        1
o4               7.90         1            40.30        0
...

我写了以下函数:

import xgboost as xgb
from sklearn.model_selection import train_test_split
from xgboost import XGBClassifier
from sklearn.metrics import accuracy_score
import pandas as pd

def predict_cn(df, rated_object):
    is_target = (df['rated_object'] == rated_object)
    target = df[is_target].iloc[0]
    cols_to_drop = ['rated_object'] 
    df.drop(cols_to_drop, axis=1, inplace=True)
    X = df.drop('rating', axis=1)  
    y = df['rating'] 
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=5)
    model = XGBClassifier() 
    model.fit(X_train, y_train)
    prediction=model.predict(target['rated_object'], verbose=False)
    return prediction

但是像predict_cn(df_content, 'o3') 这样的输入会给我错误:

TypeError                                 Traceback (most recent call last)
<ipython-input-10-08dcbb77df37> in <module>
----> 1 predict_cn(df_content, 'o3')

<ipython-input-9-18667675e17b> in predict_cn(df, rated_object)
      6     X = df.drop('rating', axis=1)
      7     y = df['rating']
----> 8     X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=5)
      9     model = XGBClassifier()
     10     model.fit(X_train, y_train)

TypeError: train_test_split() got multiple values for argument 'test_size'

我觉得很奇怪,因为当我为整个数据框单独运行这样一个模型时,它工作正常,这也是文档中的语法。如果我想输入rated_object 并获得其预测的rating,我也不知道我的其余代码是否正确。

编辑:按照@Antoine Dubuis 的建议,我尝试创建数据框的副本。下面我将发布新函数和一个小的模拟数据框,但错误仍然存​​在:

from numpy import nan
data_mock = [['q1', 10.93, 20, 1, 0], ['q2', nan, 12, 0, 1], ['q3', 14.34, 30, 0, 1], ['q4', 12.93, 20, 0, 1], ['q5', nan, 62, 1, 0], ['q6', 14.34, 60, 0, 0], ['q7', 16.93, 28, 1, 1], ['q8', nan, 12, 1, 1], ['q9', 10.34, 50, 0, 0], ['q10', 10.93, 20, 0, 0], ['q11', nan, 57, 1, 1], ['q12', 89.34, 30, 0, 0]]
df_mock = pd.DataFrame(data_mock, columns = ['rated_object', 'feature_1', 'feature_2', 'feature_n', 'rating'])
def predict_cn(df, rated_object):
    df_copy=df.copy()
    is_target = (df_copy['rated_object'] == rated_object)
    target = df_copy[is_target].iloc[0]
    cols_to_drop = ['rated_object'] 
    df_copy.drop(cols_to_drop, axis=1, inplace=True)
    X = df_copy.drop('rating', axis=1)  
    y = df_copy['rating']
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=5)
    model = XGBClassifier() 
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test) 
    prediction=model.predict(target['questionId'], verbose=False)
    return prediction

【问题讨论】:

【参考方案1】:

您应该验证变量Xy。您的 y 数组一定有错误,因为它没有被解释为 pd.Series 而是一个数值。

由于它是一个数值,它被解释为位置参数train_size,而不是必须拆分的arrays参数。

【讨论】:

确实,我打印了 y 并得到 Name: rating, Length: 2895, dtype: int64。我把它写成y = pd.DataFrame(df_content['rating']),但我仍然得到错误。 在我看来,你应该确保你的函数是幂等的。这意味着您可以不修改外部数据。我首先会执行df.copy() 以确保您没有修改原始数据框。这可能是问题所在。如果您的数据框有多行,那么从我的角度来看,您的代码应该可以正常工作。 我确实定义了df2=df.copy(),我在开始时尝试了它并没有工作,然后在删除列之前它没有工作。我应该在代码的哪个位置执行复制?我还尝试编写 y = df['rating'].values 以便 y 是一个数组,但它不起作用。 我认为我的第一条评论是错误的,因为如果我打印 y 它确实是一个系列,就像我单独打印时一样,正常运行模型而不是写成功能。我认为你对它修改我的数据是正确的,但我不知道在哪里放置副本。 你应该把它放在函数的开头,以确保没有任何东西改变你原来的DataFrame

以上是关于TypeError:train_test_split() 只有当我在函数中写入参数'test_size'时才获得多个值的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:“TypeError:函数名称不是 HTMLButtonElement.onclick (/:2:54) 处的函数”

反应本机获取多标记[未处理的承诺拒绝:TypeError:TypeError:未定义不是对象(评估'this.state.markers.map

Django TypeError - TypeError: issubclass() arg 1 必须是一个类

pyspark:TypeError:'float'对象不可迭代

Python 3.8 TypeError: can't concat str to bytes - TypeError: a bytes-like object is required, not 's

TypeError: key 必须是一个字符串,一个缓冲区或一个对象在 typeError 与 GCP 文件存在