es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El error sugiere que la función train_test_split está recibiendo múltiples valores para el argumento test_size. Esto podría suceder si el dataframe df 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:

    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):
        # crear una copia del dataframe
        df_copy = df.copy()
    
        # seleccionar el objeto objetivo
        is_target = (df_copy['rated_object'] == rated_object)
        target = df_copy[is_target].iloc[0]
    
        # eliminar las columnas irrelevantes
        cols_to_drop = ['rated_object'] 
        df_copy.drop(cols_to_drop, axis=1, inplace=True)
    
        # dividir los datos en conjuntos de entrenamiento y prueba
        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)
    
        # ajustar el modelo y hacer predicciones
        model = XGBClassifier() 
        model.fit(X_train, y_train)
        y_pred = model.predict(X_test) 
        prediction = model.predict(target.drop('rated_object'), verbose=False)
    
        return prediction
    

    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'):

    predict_cn(df_content, 'O3')
    

Comments are closed.