Python 中的逻辑回归模型具有良好的准确度和精确度,但预测有很大偏差
Logistic Regression Model in Python Has good Accuracy and Precision,but predictions are way off
我建立了一个逻辑回归模型来预测贷款接受者。数据集是 94% 的非受体和 6% 的受体。我有 运行 几个逻辑回归模型,一个使用原始数据集,一个在上采样到 50/50 并删除一些预测变量之后,一个没有上采样,但在删除一些预测变量之后。
模型 1:在 25 个特征列上的准确率、精确率和召回率优于 90%。在模型 运行 之后,我将预测输出到不同的 CSV(虽然与原始 csv 相同)并且它返回 10,000 个接受器。我的猜测是这可能是由过度拟合引起的吗?不确定,但随后在相同的 94% 非受体和 6% 受体上进行了尝试,但变量更少(19 个特征列)。这次准确率是 81%,但是准确率只有 21%,而召回率是 765(用于训练和测试)。这次只有 returns 8 个接受者(共 18,000 个)
最后,我尝试了上采样并上采样到一个平衡集。准确率仅为 68%(我可以使用),训练和测试的准确率和召回率均为 66%。 运行 然后模型将预测输出到 csv 文件(同样是同一个人,不同的 CSV 文件,不确定是否搞砸了),这次它返回了 0 个受体。
有没有人对导致此问题的原因以及如何解决此问题有任何建议?
我不确定哪个回归代码最有用。我很乐意 post 上采样代码,如果这会更有帮助的话。
import statsmodels.api as sm
y=df.OpenedLCInd.values
X=df.drop('OpenedLCInd', axis = 1)
cols=X.columns
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
minmax= MinMaxScaler()
X=pd.DataFrame(minmax.fit_transform(X))
X.columns = cols
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import precision_score, recall_score, accuracy_score, f1_score, roc_curve, auc, confusion_matrix
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = .25, random_state= 33)
logreg=LogisticRegression(fit_intercept = False, C=1e12, solver ='liblinear', class_weight='balanced')
logreg.fit(X_train, y_train)
y_hat_train = logreg.predict(X_train)
y_hat_test = logreg.predict(X_test)
residuals = np.abs(y_train - y_hat_train)
logit_model=sm.Logit(y_train,X_train)
result=logit_model.fit()
print(result.summary())
print(pd.Series(residuals).value_counts())
print(pd.Series(residuals).value_counts(normalize=True))
## Output predictions to new dataset
test=pd.read_csv(r'link')
predictions = logreg.predict(X_test)
test_predictions = logreg.predict(test.drop('OpenedLCInd', axis = 1))
test["predictions"] = test_predictions
test.to_csv(r'output link')
您没有使用验证集(上面代码中的测试集)。要修复它,让
residuals = np.abs(y_test - y_hat_test)
而不是使用 y_train
.
此外,应用交叉验证以确保模型始终良好。
我建立了一个逻辑回归模型来预测贷款接受者。数据集是 94% 的非受体和 6% 的受体。我有 运行 几个逻辑回归模型,一个使用原始数据集,一个在上采样到 50/50 并删除一些预测变量之后,一个没有上采样,但在删除一些预测变量之后。
模型 1:在 25 个特征列上的准确率、精确率和召回率优于 90%。在模型 运行 之后,我将预测输出到不同的 CSV(虽然与原始 csv 相同)并且它返回 10,000 个接受器。我的猜测是这可能是由过度拟合引起的吗?不确定,但随后在相同的 94% 非受体和 6% 受体上进行了尝试,但变量更少(19 个特征列)。这次准确率是 81%,但是准确率只有 21%,而召回率是 765(用于训练和测试)。这次只有 returns 8 个接受者(共 18,000 个)
最后,我尝试了上采样并上采样到一个平衡集。准确率仅为 68%(我可以使用),训练和测试的准确率和召回率均为 66%。 运行 然后模型将预测输出到 csv 文件(同样是同一个人,不同的 CSV 文件,不确定是否搞砸了),这次它返回了 0 个受体。
有没有人对导致此问题的原因以及如何解决此问题有任何建议?
我不确定哪个回归代码最有用。我很乐意 post 上采样代码,如果这会更有帮助的话。
import statsmodels.api as sm
y=df.OpenedLCInd.values
X=df.drop('OpenedLCInd', axis = 1)
cols=X.columns
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
minmax= MinMaxScaler()
X=pd.DataFrame(minmax.fit_transform(X))
X.columns = cols
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import precision_score, recall_score, accuracy_score, f1_score, roc_curve, auc, confusion_matrix
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = .25, random_state= 33)
logreg=LogisticRegression(fit_intercept = False, C=1e12, solver ='liblinear', class_weight='balanced')
logreg.fit(X_train, y_train)
y_hat_train = logreg.predict(X_train)
y_hat_test = logreg.predict(X_test)
residuals = np.abs(y_train - y_hat_train)
logit_model=sm.Logit(y_train,X_train)
result=logit_model.fit()
print(result.summary())
print(pd.Series(residuals).value_counts())
print(pd.Series(residuals).value_counts(normalize=True))
## Output predictions to new dataset
test=pd.read_csv(r'link')
predictions = logreg.predict(X_test)
test_predictions = logreg.predict(test.drop('OpenedLCInd', axis = 1))
test["predictions"] = test_predictions
test.to_csv(r'output link')
您没有使用验证集(上面代码中的测试集)。要修复它,让
residuals = np.abs(y_test - y_hat_test)
而不是使用 y_train
.
此外,应用交叉验证以确保模型始终良好。