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.

Escribir un modelo de clasificación como una función.

Dado un dataframe df2 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
...

Se escribió el siguiente modelo:

import xgboost as xgb
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder 
from xgboost import XGBClassifier

cols_to_drop = ['rated_object'] 
df2.drop(cols_to_drop, axis=1, inplace=True)

X = df2.drop('rating', axis=1)  
y = df2['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) 

Se desea escribir una función que tome como entrada el dataframe y el objeto puntuado y devuelva la puntuación predicha. Para ello, se escribió la siguiente función:

def function(df2, rated_object):...

Sin embargo, se produce un error en la línea de train_test_split() porque “se obtuvo un valor múltiple para el argumento test_size”, incluso si se copió 1 a 1 desde arriba.

Se desea ingresar, por ejemplo, function(df2, o4) y obtener la calificación predicha. ¿Es posible?

Edite: esto es lo que se hizo:

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

y el error al ingresar, por ejemplo, predict_cn(df2, 'o3'):

TypeError                                 Traceback (most recent call last)
<ipython-input-10-08dcbb77df37> in <module>
----> 1 predict_cn(df2, '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'

Se sabe que es porque y es de tipo numérico cuando se imprime, pero se intentó escribirlo como y = pd.DataFrame(df2['rating']) y todavía se produce el error.

Edit: nuevo código y datos ficticios para experimentar:

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['rated_object'], verbose=False)
    return prediction
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para hacer que el código funcione como una función que toma el dataframe y el “rated_object” como entrada y devuelve la calificación pronosticada, necesita hacer algunas modificaciones.

    Primero, asegúrese de importar las bibliotecas y los módulos necesarios:

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

    Luego defina su función:

    def predecir_calificacion(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)
        y_pred = model.predict(X_test) 
        prediction=model.predict(target, verbose=False)
        return prediction
    

    La función toma como entrada un dataframe ‘df’ y un ‘rated_object’ (un objeto de la columna ‘rated_object’). Primero, selecciona la fila ‘rated_object’ y elimina esa columna junto con ‘rating’. Luego divide los datos en conjuntos de entrenamiento y prueba, ajusta un modelo XGBClassifier en los datos de entrenamiento y hace una predicción en los datos de prueba. Finalmente, hace una predicción en la fila objetivo y devuelve la calificación pronosticada.

    Para usar la función, lo llamaría de la siguiente manera:

    predecir_calificacion(df2, 'o4')
    

    Donde ‘df2’ es el dataframe y ‘o4’ es el objeto calificado para el cual desea predecir la calificación.

Comments are closed.