TypeError: train_test_split() recibió varios valores para el argumento ‘test_size’ solo cuando lo escribo en una función.
Para un dataframe df_content
que se ve así:
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
...
Escribí la siguiente función:
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
Pero dar una entrada como predict_cn(df_content, 'o3')
me da el error:
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'
Me parece extraño porque cuando ejecuto este modelo por separado para todo este dataframe, funciona bien. Además, no sé si el resto de mi código es correcto para ingresar un rated_object
y obtener su rating
estimado.
EDIT: siguiendo las sugerencias de @Antoine Dubuis, intenté crear una copia del dataframe. Abajo escribiré la nueva función y un pequeño dataframe falso, pero el error persiste:
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
davy.ai
El error sugiere que la función
train_test_split
está recibiendo múltiples valores para el argumentotest_size
. Esto podría suceder si el dataframedf
tiene columnas duplicadas.Para solucionar este problema, puede crear una copia del dataframe al comienzo de la función, eliminar las columnas irrelevantes y utilizar la copia para el procesamiento posterior.
Aquí está la función modificada:
Note que también modifiqué la línea donde se hace la predicción final, ya que estaba intentando hacer la predicción utilizando todo el dataframe en lugar de solo la fila objetivo.
Para probar la función, puede utilizar el dataframe
df_content
que proporcionaste. Asegúrese de llamar a la función con el nombre de columna correcto para los datos objetivo (en tu ejemplo, era'o3'
, pero en el dataframe está escrito como'O3'
):