如何处理包含离散和连续数据的数据集

我正在训练一个包含8个特征的模型,用于预测房间出售的概率。


地区:房间所在的地区(整数,取值范围为1到10)

日期:入住日期(整数,取值范围为1到365,这里我们只考虑一天的请求)

星期:星期几(整数,取值范围为1到7)

公寓:房间是否为整套公寓(1)还是单个房间(0)

床位数:房间内的床位数量(整数,取值范围为1到4)

评价:卖家的平均评价(连续变量,取值范围为1到5)

图片质量:房间图片的质量(连续变量,取值范围为0到1)

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

接受:此发布是否最终被接受(有人接受,1)或未被接受(0)


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

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

我不确定哪里出了问题,但我认为原因可能是由于离散和连续数据的混合。尤其是有些数据要么是0要么是1。有人能帮忙吗?

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import roc_auc_scorefrom sklearn.neural_network import MLPClassifierfrom sklearn.preprocessing import MinMaxScalerfrom sklearn.preprocessing import OneHotEncoderimport warningswarnings.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 PowerTransformerpt = 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()    # Normalizationsc = 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 RandomForestClassifierclf =  RandomForestClassifier(random_state=123, n_estimators=50)clf.fit(X_train,y_train)yhat = clf.predict_proba(X_test)# AUC metrictrain_accuracy = roc_auc_score(y_test, yhat[:,-1])print("AUC",train_accuracy)from sklearn.ensemble import GradientBoostingClassifierclf =  GradientBoostingClassifier(random_state=123, n_estimators=50)clf.fit(X_train,y_train)yhat = clf.predict_proba(X_test)# AUC metrictrain_accuracy = roc_auc_score(y_test, yhat[:,-1])print("AUC",train_accuracy)from torch import nnfrom skorch import NeuralNetBinaryClassifierimport torchmodel = 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 XGBClassifierclf = 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 metrictrain_accuracy = roc_auc_score(y_test, yhat[:,-1])print("AUC",train_accuracy)

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


回答:

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

  • 数据理解 – 当前格式的数据字段是否合理(数据类型、值范围等)
  • 数据准备 – 在将这些数据字段传递给模型之前,我应该如何更新它们?你认为哪些输入对你的模型有用,哪些输入带来的好处很少?是否有我需要考虑/处理的异常值?

如果你刚开始进入数据分析领域,一本不错的书是机器学习和预测数据分析的基础(我与此书无任何关联)。

查看你的数据集,有几件事你可以尝试,看看它们如何影响你的预测结果:

  • 除非地区顺序实际上是按重要性/价值排列的,否则我会将其更改为独热编码特征,你可以在sklearn中这样做。否则,你的模型可能会认为编号较高的地区(比如10)比编号较低的地区(比如1)更重要。
  • 如果你的一些类别与其他数据字段相比要大得多,你可以尝试对它们进行归一化处理,为什么数据归一化对机器学习模型是必要的

考虑查看Kaggle竞赛房价:高级回归技术。它正在做与你尝试做的事情类似的事情,并且在Notebook和讨论标签中可能会有一些关于你应该如何处理问题的指导意见。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注