Avoir toutes mes prédictions inclinées d'un côté pour la classification binaire

Aug 18 2020

J'étais en train de former un modèle contenant 8 fonctionnalités qui nous permettent de prédire la probabilité qu'une pièce soit vendue.

  • Région: la région à laquelle appartient la pièce (un entier, prenant une valeur comprise entre 1 et 10)

  • Date: La date du séjour (un entier entre 1‐365, ici nous ne considérons qu'une demande d'un jour)

  • Jour de la semaine: jour de la semaine (un entier entre 1 et 7)

  • Appartement: si la pièce est un appartement entier (1) ou juste une pièce (0)

  • #beds: Le nombre de lits dans la chambre (un entier entre 1 et 4)

  • Avis: Avis moyen du vendeur (une variable continue entre 1 et 5)

  • Pic Quality: Qualité de l'image de la pièce (une variable continue entre 0 et 1)

  • Prix: le prix historique affiché de la chambre (une variable continue)

  • Accepter: si ce message est accepté (quelqu'un l'a pris, 1) ou non (0) à la fin *

La colonne Accepter est le "y". Il s'agit donc d'une classification binaire.


  1. J'ai fait OneHotEncoderpour les données catégoriques.
  2. J'ai appliqué la normalisation aux données.
  3. J'ai modifié les RandomRofrestparamètres suivants :
  • Max_depth: Pic à 16
  • n_estimators: Pic à 300
  • min_samples_leaf: Pic à 2
  • max_features: N'a aucun effet sur l'AUC.

L'AUC a culminé à 0,7889. Que puis-je faire d'autre pour l'augmenter?


Voici mon code

import pandas as pd
import numpy as np
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import OneHotEncoder
from sklearn.pipeline import make_pipeline
from sklearn.compose import make_column_transformer
from sklearn.model_selection import train_test_split
df_train = pd.read_csv('case2_training.csv')

# Exclude ID since it is not a feature
X, y = df_train.iloc[:, 1:-1], df_train.iloc[:, -1]
y = y.astype(np.float32)

# Split the data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.05,shuffle=False)

ohe = OneHotEncoder(sparse = False)
column_trans = make_column_transformer(
(OneHotEncoder(),['Region','Weekday','Apartment']),remainder='passthrough')
X_train = column_trans.fit_transform(X_train)
X_test = column_trans.fit_transform(X_test)

# Normalization
from sklearn.preprocessing import MaxAbsScaler
mabsc = MaxAbsScaler()

X_train = mabsc.fit_transform(X_train)
X_test = mabsc.transform(X_test)

X_train = X_train.astype(np.float32)
X_test = X_test.astype(np.float32)

from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import roc_auc_score

RF =  RandomForestClassifier(min_samples_leaf=2,random_state=0, n_estimators=300,max_depth = 16,n_jobs=-1,oob_score=True,max_features=i)
cross_val_score(RF,X_train,y_train,cv=5,scoring = 'roc_auc').mean()
RF.fit(X_train, y_train)
yhat = RF.predict_proba(X_test)

print("AUC:",roc_auc_score(y_test, yhat[:,-1]))

# Run the prediction on the given test set.
testset = pd.read_csv('case2_testing.csv')
testset = testset.iloc[:, 1:] # exclude the 'ID' column
testset = column_trans.fit_transform(testset)
testset = mabsc.transform(testset)


yhat_2 = RF.predict_proba(testset)
final_prediction = yhat[:,-1]

Cependant, toutes les probabilités de «final_prediction» sont inférieures à 0,45, en gros, le modèle estime que tous les échantillons sont égaux à 0. Quelqu'un peut-il aider?

Réponses

N.Kiefer Aug 19 2020 at 08:25

Vous utilisez column_trans.fit_transformsur l'ensemble de test, cela écrase complètement les fonctionnalités qui ont été installées pendant la formation. Fondamentalement, les données sont désormais dans un format que votre modèle entraîné ne comprend pas.

Une fois monté en formation sur le kit d'entraînement, il suffit de l'utiliser column_trans.transformaprès.