首页 > 解决方案 > 如何处理包含离散和连续数据的数据集

问题描述

我正在训练一个包含 8 个特征的模型,可以让我们预测房间被售出的概率。


Region:房间所属的区域(整数,取值在1到10之间)

日期:入住日期(1-365之间的整数,这里我们只考虑一日请求)

Weekday:星期几(1-7 之间的整数)

公寓:房间是整个公寓(1)还是只是一个房间(0)

#beds:房间的床位数(1-4之间的整数)

评论:卖家的平均评论(1到5之间的连续变量)

图片质量:房间图片的质量(0到1之间的连续变量)

价格:房间历史公布的价格(连续变量)

接受:这个帖子最后是否被接受(有人接受,1)或不接受(0)


列接受是“y”。因此,这是一个二元分类。

我们已经绘制了数据,并且一些数据是倾斜的,因此我们应用了幂变换。我们尝试了神经网络、ExtraTrees、XGBoost、梯度提升、随机森林。他们都给出了大约 0.77 AUC。然而,当我们在测试集上尝试它们时,AUC 下降到 0.55,精度为 27%。

我不确定什么时候出错了,但我的想法是原因可能是由于离散数据和连续数据的混合。尤其是其中一些是 0 或 1。有人可以帮忙吗?

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score
from sklearn.neural_network import MLPClassifier
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import OneHotEncoder
import warnings
warnings.filterwarnings('ignore')

df_train = pd.read_csv('case2_training.csv')

X, y = df_train.iloc[:, 1:-1], df_train.iloc[:, -1]
y = y.astype(np.float32)


X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=123)

from sklearn.preprocessing import PowerTransformer

pt = PowerTransformer()

transform_list = ['Pic Quality', 'Review', 'Price']
X_train[transform_list] = pt.fit_transform(X_train[transform_list])
X_test[transform_list] = pt.transform(X_test[transform_list])

for i in transform_list:
    df = X_train[i]
    ax = df.plot.hist()
    ax.set_title(i)
    plt.show()
    
# Normalization
sc = MinMaxScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

X_train = X_train.astype(np.float32)
X_test = X_test.astype(np.float32)


from sklearn.ensemble import RandomForestClassifier

clf =  RandomForestClassifier(random_state=123, n_estimators=50)
clf.fit(X_train,y_train)
yhat = clf.predict_proba(X_test)

# AUC metric
train_accuracy = roc_auc_score(y_test, yhat[:,-1])
print("AUC",train_accuracy)

from sklearn.ensemble import GradientBoostingClassifier

clf =  GradientBoostingClassifier(random_state=123, n_estimators=50)
clf.fit(X_train,y_train)
yhat = clf.predict_proba(X_test)

# AUC metric
train_accuracy = roc_auc_score(y_test, yhat[:,-1])
print("AUC",train_accuracy)


from torch import nn
from skorch import NeuralNetBinaryClassifier
import torch

model = nn.Sequential(
          nn.Linear(8,64),
          nn.BatchNorm1d(64),
          nn.GELU(),
          nn.Linear(64,32),
          nn.BatchNorm1d(32),
          nn.GELU(),
          nn.Linear(32,16),
          nn.BatchNorm1d(16),
          nn.GELU(),
          nn.Linear(16,1),
#           nn.Sigmoid()
        )
net = NeuralNetBinaryClassifier(
    model,
    max_epochs=100,
    lr=0.1,
    # Shuffle training data on each epoch
    optimizer=torch.optim.Adam,
    iterator_train__shuffle=True,
)
net.fit(X_train, y_train)
 

from xgboost.sklearn import XGBClassifier

clf = XGBClassifier(silent=0, 
                    learning_rate=0.01,  
                    min_child_weight=1,
                    max_depth=6,
                    objective='binary:logistic',
                    n_estimators=500,
                    seed=1000)

clf.fit(X_train,y_train)
yhat = clf.predict_proba(X_test)

# AUC metric
train_accuracy = roc_auc_score(y_test, yhat[:,-1])
print("AUC",train_accuracy)

这是数据截图的附件。 样本数据

标签: pythonmachine-learningscikit-learndeep-learningclassification

解决方案


这是数据分析的基本第一步。你需要在这里做两件事:

  • 数据理解——当前格式的数据字段是否有意义(数据类型、值范围等)
  • 数据准备 - 在将这些数据字段传递给我们的模型之前,我应该如何更新它们?此外,您认为哪些输入对您的模型有用,哪些输入几乎没有什么好处?是否有我需要考虑/处理的异常值?

如果您是数据分析领域的入门者,那么一本好书是《用于预测数据分析的机器学习基础》(我与这本书无关)。

查看您的数据集,您可以尝试了解它如何影响您的预测结果:

  • 除非区域顺序实际上按重要性/价值进行排名,否则我会将其更改为一个热编码特征,您可以在sklearn中执行此操作。否则,您会冒着模型认为具有较高数字(例如 10)的区域比具有较低值(例如 1)的区域更重要的风险。
  • 如果某些类别比某些其他数据字段大得多,您可以尝试对其进行规范化为什么机器学习模型需要数据规范化

考虑查看 Kaggle 竞赛房价:高级回归技术。它所做的事情与您尝试做的事情类似,并且它可能会为您在笔记本和讨论选项卡中如何解决问题提供一些指导。


推荐阅读