我最近在kaggle(Shape:1646801,150)的数据集上构建了一个预测模型(Logistic回归) . 然而,在简单的预处理之后,我得到了非常不寻常的99.9%的准确度 . 数据:https://www.kaggle.com/wordsforthewise/lending-club
迈出了一步:
-
Mapped 不同的 loan_status ('Fully_Paid','Default','Charged Off')到 default (0,1)
-
查找每列 null 的计数, remove column 如果 null > 10000
-
删除其他空值的行,形状为左(814392,51)
-
删除成绩并将 sub_grade ('A1','A3')映射为 integer (0,2)
-
One-Hot Encoding
具有Logistic回归的 -
Modeling (Class label ratio is 1:4)
对于建模部分,我首先使用列车测试分割并获得99.9%的准确度 . 我还检查了混淆矩阵,TP和TN都很高 . 我还检查了功能的重要性,功能似乎正常,似乎没有任何功能明显优于其他功能 . 我也尝试过5次和10次交叉验证,准确度仍然很高 .
下面是建模代码,如果它似乎有助于解决问题,我将展示任何预处理代码 .
y = df2[['default']].values.ravel()
X = df2.drop(columns = 'default').values
X_train, X_test, y_train, y_test=train_test_split(X, y, test_size=.2)
features = df2.drop(columns = 'default').columns.tolist()
LR = model.LogisticRegression()
LR.fit(X_train,y_train)
y_pred = LR.predict(X_test)
print('Accuracy : ', metrics.accuracy_score(y_test, y_pred))
print('\n', metrics.classification_report(y_test, y_pred))
print('Confusion Matrix')
print(metrics.confusion_matrix(y_test, y_pred))
什么似乎是问题?这是我做错的任何部分吗?
2 回答
这句话错了 -
scores = cross_val_score(LR, X, y, cv=5)
. 您在交叉验证步骤中将模型公开为X_test
和y_test
. 您的模型在培训或交叉验证期间永远无法看到您的测试数据 . 相反,你可以做scores = cross_val_score(LR, X_train, y_train, cv=5)
并在你的测试集上进行预测 .另一种方法可以是使用验证集方法而不是k-fold CV .
查看scikit-learn的
GridSearchCV
.您需要小心分割数据的方式以及使用的列 . 似乎数据中有一个小time series . 这意味着对于一个客户,可能存在多个数据点 . 我会确保删除id字段 .
如果仍然没有帮助,请按客户划分数据并将客户分成培训/测试 .
然后查看与loan_status高度相关的字段 . 有些可能与此人已经违约的事实有关 . 相反,您可以根据上个月的数据预测客户的默认状态 .
你也删除了很多行 - 这可能没问题,但你也可以选择易于分类的案例 .