Memiliki semua prediksi saya cenderung ke satu sisi untuk klasifikasi biner

Aug 18 2020

Saya melatih model yang berisi 8 fitur yang memungkinkan kami memprediksi kemungkinan sebuah ruangan terjual.

  • Wilayah: Wilayah tempat ruangan berada (bilangan bulat, mengambil nilai antara 1 dan 10)

  • Tanggal: Tanggal menginap (bilangan bulat antara 1‐365, di sini kami hanya mempertimbangkan permintaan satu hari)

  • Hari kerja: Hari dalam seminggu (bilangan bulat antara 1‐7)

  • Apartemen: Apakah ruangan itu seluruh apartemen (1) atau hanya satu kamar (0)

  • #beds: Jumlah tempat tidur di kamar (bilangan bulat antara 1-4)

  • Ulasan: Rata-rata ulasan penjual (variabel kontinu antara 1 dan 5)

  • Kualitas Gambar: Kualitas gambar ruangan (variabel kontinu antara 0 dan 1)

  • Harga: dia mencatat harga kamar yang bersejarah (variabel kontinu)

  • Terima: Apakah postingan ini diterima (seseorang mengambilnya, 1) atau tidak (0) pada akhirnya *

Kolom Terima adalah "y". Karenanya, ini adalah klasifikasi biner.


  1. Saya telah melakukan OneHotEncoderuntuk data kategorikal.
  2. Saya telah menerapkan normalisasi pada data.
  3. Saya telah mengubah RandomRofrestparameter berikut :
  • Max_depth: Puncak pada 16
  • n_estimators: Puncak 300
  • min_samples_leaf: Puncak pada 2
  • max_features: Tidak berpengaruh pada AUC.

AUC memuncak pada 0,7889. Apa lagi yang bisa saya lakukan untuk meningkatkannya?


Ini kode saya

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]

Namun, semua probabilitas dari 'final_prediction` di bawah 0,45, pada dasarnya, model percaya bahwa semua sampel adalah 0. Adakah yang bisa membantu?

Jawaban

N.Kiefer Aug 19 2020 at 08:25

Anda menggunakan column_trans.fit_transformdi set pengujian, ini sepenuhnya menimpa fitur yang dipasang selama pelatihan. Pada dasarnya, data sekarang dalam format yang tidak dipahami oleh model terlatih Anda.

Setelah dipasang dalam pelatihan di set pelatihan, cukup gunakan column_trans.transformsetelahnya.