我正在训练一个包含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和讨论标签中可能会有一些关于你应该如何处理问题的指导意见。