การคาดการณ์ทั้งหมดของฉันเอนเอียงไปทางด้านใดด้านหนึ่งสำหรับการจำแนกไบนารี

Aug 18 2020

ฉันกำลังฝึกโมเดลที่มีคุณสมบัติ 8 อย่างที่ช่วยให้เราสามารถคาดเดาความน่าจะเป็นของห้องที่ขายได้

  • ภูมิภาค: พื้นที่ที่เป็นของห้อง (จำนวนเต็มรับค่าระหว่าง 1 ถึง 10)

  • วันที่: วันที่เข้าพัก (จำนวนเต็มระหว่าง 1-35 เราจะพิจารณาคำขอเพียงวันเดียวเท่านั้น)

  • วันธรรมดา: วันในสัปดาห์ (จำนวนเต็มระหว่าง 1-7)

  • อพาร์ทเมนต์: ไม่ว่าห้องจะเป็นอพาร์ทเมนต์ทั้งหมด (1) หรือแค่ห้อง (0)

  • #beds: จำนวนเตียงในห้อง (จำนวนเต็มระหว่าง 1-4)

  • บทวิจารณ์: บทวิจารณ์โดยเฉลี่ยของผู้ขาย (ตัวแปรต่อเนื่องระหว่าง 1 ถึง 5)

  • Pic Quality: คุณภาพของรูปภาพของห้อง (ตัวแปรต่อเนื่องระหว่าง 0 ถึง 1)

  • ราคา: เขาโพสต์ราคาห้องพักในอดีต (ตัวแปรต่อเนื่อง)

  • ยอมรับ: ไม่ว่าโพสต์นี้จะได้รับการยอมรับ (มีคนเอาไป 1) หรือไม่ (0) ในท้ายที่สุด *

คอลัมน์ Accept คือ "y" ดังนั้นนี่คือการจำแนกประเภทไบนารี


  1. ฉันได้ทำOneHotEncoderเพื่อข้อมูลที่เป็นหมวดหมู่
  2. ฉันได้ใช้การทำให้เป็นมาตรฐานกับข้อมูลแล้ว
  3. ฉันได้แก้ไขRandomRofrestพารามิเตอร์ต่อไปนี้:
  • Max_depth: สูงสุดที่ 16
  • n_estimators: สูงสุดที่ 300
  • min_samples_leaf: พีคที่ 2
  • max_features: ไม่มีผลกระทบต่อ AUC

AUC สูงสุดที่ 0.7889 ฉันจะทำอะไรได้อีกบ้างเพื่อเพิ่ม


นี่คือรหัสของฉัน

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]

อย่างไรก็ตามความน่าจะเป็นทั้งหมดจาก 'final_prediction' ต่ำกว่า 0.45 โดยทั่วไปโมเดลเชื่อว่าตัวอย่างทั้งหมดเป็น 0 มีใครช่วยได้บ้าง

คำตอบ

N.Kiefer Aug 19 2020 at 08:25

คุณกำลังใช้column_trans.fit_transformกับชุดทดสอบซึ่งจะเขียนทับคุณลักษณะที่ติดตั้งระหว่างการฝึกอบรมทั้งหมด โดยพื้นฐานแล้วข้อมูลอยู่ในรูปแบบที่โมเดลฝึกของคุณไม่เข้าใจ

เมื่อติดตั้งชุดฝึกแล้วให้ใช้งานในcolumn_trans.transformภายหลัง