我有兴趣预测医生是否会开出特定的药物并选择逻辑回归作为起点。
我有几个问题:
- 特征选择是选择相关变量的第一步吗?
- 逻辑回归仅适用于二进制输出吗?对于每个医生,我可以得到药物处方的概率(例如医生1 = 0.87,医生2 = 0.56)?
- 如何将我的模型部署到生产中?这是一项艰巨的任务吗?
我有兴趣预测医生是否会开出特定的药物并选择逻辑回归作为起点。
我有几个问题:
我不会从(手动)特征选择开始。改用 Lasso 来“自动”收缩/选择特征(这基本上是带有收缩特征的 Logit)。Logit(或此处的带有 Lasso 的 Logit)适用于二进制情况,但您也可以执行“Multinominal Logit”(multi_class='multinomial'sklearn 中的选项),它适用于两个以上的类。通常你sklearn在 Python 中使用这些东西。sklearn另请参阅文档中的示例。
确保你有一个测试和培训集。还要确保不要使用测试集中的数据进行训练。仅在训练集上进行训练并使用测试集来查看您的模型在训练期间未看到的数据上的表现。
当您说“转向生产”时,尚不清楚您的意思。这取决于你的问题。您只需要在这里进行预测,但实施当然取决于环境。
可以玩弄数据。但是,如果你真的想学习严肃的数据科学,你应该看看所有这些魔法背后的方法。我推荐“统计学习导论”。这是一本非常好的书,有很多代码示例,而且技术含量不高。
请注意,没有灵丹妙药。Lasso 或 Logit 可能没问题,但其他方法可能更好。这实际上取决于问题/数据。
这是 Lasso 的一个小示例代码:
# Split test/train
from sklearn.model_selection import train_test_split
xtrain, xtest, ytrain, ytest = train_test_split(X, y, test_size=0.20, random_state=7)
from sklearn.metrics import roc_auc_score
from sklearn.metrics import confusion_matrix
from sklearn.linear_model import Lasso
from sklearn.linear_model import LassoCV
# Perform lasso CV to get the best parameter alpha for regulation
lasso = Lasso(max_iter=10000)
lassocv = LassoCV(alphas=None, cv=10, max_iter=10000)
lassocv.fit(xtrain, ytrain.values.ravel())
# Fit lasso using the best alpha
lasso.set_params(alpha=lassocv.alpha_)
lasso.fit(xtrain, ytrain)
# Look at results (coefficients)
la1 = pd.Series(abs(lasso.coef_), name="lasso")
la2 = pd.Series(X.columns, name="names")
dflasso = pd.concat([la2,la1], axis=1)
dflasso = dflasso.sort_values(by=['lasso'], ascending=False)
print(dflasso)
# Look at AUC
print("AUC Lasso: %.3f" %roc_auc_score(ytest.values, lasso.predict(xtest)))
# Predict probs
lasspreds0 = lasso.predict(xtest)
# Classes
lasspreds = np.round(lasspreds0)
# Confusion matrix
tnlog, fplog, fnlog, tplog = confusion_matrix(ytest, lasspreds).ravel() #y_true, y_pred
print("True negative: %s, False positive: %s, False negative: %s, True positive %s" %(tnlog, fplog, fnlog, tplog))
print("Share false %.2f" %(((fplog+fnlog)/(fplog+fnlog+tplog+tnlog))))
# Look at probs
print("Min. prob. of belonging to class 0: %.3f" %lasspreds0.min())
print("Max. prob. of belonging to class 0: %.3f" %lasspreds0.max())
编辑:
请注意,上面描述的 sklearn Lasso 不进行逻辑回归,这意味着预测可以小于零或大于一。要将 Lasso 与 Logit 一起使用(确保预测为零或一),可以使用LogisticRegression:
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
X, y = load_iris(return_X_y=True)
log = LogisticRegression(penalty='l1', solver='liblinear')
log.fit(X, y)
要添加@Peter 的答案,您可以使用方法:classifier.predict_proba(X_test)获取X_test属于每个类的概率。
这称为软预测,很可能需要称为概率校准的东西来获得可用概率。硬预测是该classifier.predict()方法的作用。它采用概率最高的类并将其标签分配给您的X_test.
PS:如果您坚持使用 Logistic 回归,则不需要概率校准,因为 LR 会自动优化 logloss 概率。但是,如果您选择了另一个分类器,则需要对其进行校准。