Tüm tahminlerimin ikili sınıflandırma için bir tarafa eğimli olması

Aug 18 2020

Bir odanın satılma olasılığını tahmin etmemize izin veren 8 özellik içeren bir model eğitiyordum.

  • Bölge: Odanın ait olduğu bölge (1 ile 10 arasında bir değer alan bir tam sayı)

  • Tarih: Konaklama tarihi (1‐365 arasında bir tam sayı, burada yalnızca bir günlük talebi dikkate alıyoruz)

  • Hafta içi: Haftanın günü (1-7 arasında bir tam sayı)

  • Daire: Odanın bütün bir daire (1) veya sadece bir oda (0) olması

  • #beds: Odadaki yatak sayısı (1-4 arasında bir tam sayı)

  • İnceleme: Satıcının ortalama incelemesi (1 ile 5 arasında sürekli bir değişken)

  • Resim Kalitesi: Odanın resminin kalitesi (0 ile 1 arasında sürekli bir değişken)

  • Fiyat: Odanın tarihsel olarak yayınlanan fiyatı (sürekli değişken)

  • Kabul et: Sonunda bu gönderinin kabul edilip edilmeyeceği (biri aldı, 1) veya istemeyecek (0)

Kabul Et sütunu "y" dir. Dolayısıyla, bu ikili bir sınıflandırmadır.


  1. OneHotEncoderKategorik veriler için yaptım .
  2. Verilere normalleştirme uyguladım.
  3. Aşağıdaki RandomRofrestparametreleri değiştirdim :
  • Max_depth: En yüksek 16
  • n_estimators: 300'de tepe
  • min_samples_leaf: Zirve 2'de
  • max_features: EAA üzerinde etkisi yoktur.

AUC 0,7889'da zirve yaptı. Arttırmak için başka ne yapabilirim?


İşte kodum

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]

Bununla birlikte, 'final_prediction'dan tüm olasılıklar 0.45'in altındadır, temelde model tüm örneklerin 0 olduğuna inanmaktadır.

Yanıtlar

N.Kiefer Aug 19 2020 at 08:25

Kullandığınız column_trans.fit_transformbu tamamen eğitim sırasında takıldı özellikleri üzerine yazar, deney setinde. Temelde veriler artık eğitimli modelinizin anlamadığı bir formattadır.

Eğitim setine eğitime takıldıktan column_trans.transformsonra , daha sonra kullanın .