Avoir toutes mes prédictions inclinées d'un côté pour la classification binaire
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.
- J'ai fait
OneHotEncoder
pour les données catégoriques. - J'ai appliqué la normalisation aux données.
- J'ai modifié les
RandomRofrest
paramètres suivants :
Max_depth
: Pic à 16n_estimators
: Pic à 300min_samples_leaf
: Pic à 2max_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
Vous utilisez column_trans.fit_transform
sur 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.transform
après.