이진 분류를 위해 모든 예측을 한쪽으로 기울였습니다.

Aug 18 2020

방이 팔릴 확률을 예측할 수있는 8 가지 기능이 포함 된 모델을 훈련하고있었습니다.

  • 지역 : 방이 속한 지역 (정수, 1에서 10 사이의 값)

  • 날짜 : 체류 날짜 (1 ~ 365 사이의 정수, 여기서는 1 일 요청 만 고려)

  • 평일 : 요일 (1-7 사이의 정수)

  • 아파트 : 방이 전체 아파트인지 (1) 아니면 그냥 방인지 (0)

  • #beds : 방에있는 침대 수 (1-4 사이의 정수)

  • 검토 : 판매자의 평균 검토 (1과 5 사이의 연속 변수)

  • Pic Quality : 방의 그림 품질 (0과 1 사이의 연속 변수)

  • 가격 : 그는 방의 역사적 게시 가격 (연속 변수)

  • 수락 :이 게시물이 수락되었는지 (누군가가 가져 갔는지, 1) 마지막에 수락되지 않았는지 (0) *

수락 열은 "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나중에 사용하기 만하면됩니다 .