Avendo tutte le mie previsioni inclinate da una parte per la classificazione binaria

Aug 18 2020

Stavo addestrando un modello che contiene 8 caratteristiche che ci consentono di prevedere la probabilità di vendita di una stanza.

  • Regione: la regione a cui appartiene la stanza (un numero intero, che assume un valore compreso tra 1 e 10)

  • Data: la data del soggiorno (un numero intero compreso tra 1 e 365, qui si considera solo la richiesta di un giorno)

  • Giorno della settimana: giorno della settimana (un numero intero compreso tra 1 e 7)

  • Appartamento: se la stanza è un intero appartamento (1) o solo una stanza (0)

  • #beds: il numero di letti in camera (un numero intero compreso tra 1 e 4)

  • Revisione: recensione media del venditore (una variabile continua tra 1 e 5)

  • Pic Quality: qualità dell'immagine della stanza (una variabile continua tra 0 e 1)

  • Prezzo: il prezzo storico pubblicato della camera (una variabile continua)

  • Accetta: se questo post viene accettato (qualcuno lo ha preso, 1) o meno (0) alla fine *

La colonna Accetta è la "y". Quindi, questa è una classificazione binaria.


  1. Ho fatto OneHotEncoderper i dati categoriali.
  2. Ho applicato la normalizzazione ai dati.
  3. Ho modificato i seguenti RandomRofrestparametri:
  • Max_depth: Picco alle 16
  • n_estimators: Picco a 300
  • min_samples_leaf: Picco a 2
  • max_features: Non ha effetto sull'AUC.

L'AUC ha raggiunto il picco a 0,7889. Cos'altro posso fare per aumentarlo?


Ecco il mio codice

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]

Tuttavia, tutte le probabilità da 'final_prediction` sono inferiori a 0,45, in pratica, il modello ritiene che tutti i campioni siano 0. Qualcuno può aiutare?

Risposte

N.Kiefer Aug 19 2020 at 08:25

Stai utilizzando column_trans.fit_transformsul set di test, questo sovrascrive completamente le funzionalità che sono state adattate durante l'allenamento. Fondamentalmente i dati sono ora in un formato che il tuo modello addestrato non comprende.

Una volta montato in allenamento sul set di allenamento, è sufficiente utilizzarlo in column_trans.transformseguito.