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
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:
Luego defina su función:
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:
Donde ‘df2’ es el dataframe y ‘o4’ es el objeto calificado para el cual desea predecir la calificación.