python - 如何处理包含离散和连续数据的数据集
问题描述
我正在训练一个包含 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)
这是数据截图的附件。 样本数据
解决方案
这是数据分析的基本第一步。你需要在这里做两件事:
- 数据理解——当前格式的数据字段是否有意义(数据类型、值范围等)
- 数据准备 - 在将这些数据字段传递给我们的模型之前,我应该如何更新它们?此外,您认为哪些输入对您的模型有用,哪些输入几乎没有什么好处?是否有我需要考虑/处理的异常值?
如果您是数据分析领域的入门者,那么一本好书是《用于预测数据分析的机器学习基础》(我与这本书无关)。
查看您的数据集,您可以尝试了解它如何影响您的预测结果:
- 除非区域顺序实际上按重要性/价值进行排名,否则我会将其更改为一个热编码特征,您可以在sklearn中执行此操作。否则,您会冒着模型认为具有较高数字(例如 10)的区域比具有较低值(例如 1)的区域更重要的风险。
- 如果某些类别比某些其他数据字段大得多,您可以尝试对其进行规范化为什么机器学习模型需要数据规范化
考虑查看 Kaggle 竞赛房价:高级回归技术。它所做的事情与您尝试做的事情类似,并且它可能会为您在笔记本和讨论选项卡中如何解决问题提供一些指导。
推荐阅读
- excel - 如何根据 Excel 中另一列的数据计算一列的总和?
- matlab - 如何找出哪个变量触发了有关全局变量的 Matlab 警告
- python - pyplot 如何在同一轴上绘制 3D 散点图和颤动图?
- python - MySQL/Python 获取数字省略零
- selenium - 为什么 Edge/Selenium 在与托管节点的 Windows 10 虚拟机断开连接时会抛出错误?
- magnolia - 脚本 Magnolia 页面创建
- php - POST 时出现 Android Volly 客户端错误
- jquery - 滑入式菜单高度更改时,外部 div 不会展开
- javascript - EXTJS4 - 修改后的记录不显示
- bootbox - Bootbox 中预先选中的复选框