通过 发现 ML 世界sklearn
,我正在我的数据集上测试一大组模型。这是为了学习目的,也是为了工作,所以我希望最终模型尽可能准确,同时我可以在我对 ML 的理解方面取得进步。
我已经将我的数据集(16k 行)分成 80% 的训练和 20% 的测试,并且我正在测试至少KNN
, Logistic
, DecisionTree
, RandomForest
,NaivesBayes
也许SVC
(如果我的计算机可以处理的话),Bagging
当Boosting
我发现如何.
我的训练样本有 4 种方式:2 组特征(95 和 11),是否标准化(带有 a StandardScaler
)。
我的结果是二元的,我正在使用自定义记分器“改进”,它可以最大限度地增加第 30 个百分位数的阳性数(在我的帖子末尾使用代码更容易得到它),以及specificity
和roc_auc
。
对于每个数据集,我交叉验证(以随机状态分层和打乱,5 次折叠,尽可能重复)我发现相关的所有超参数,并对每个训练样本重复此操作。
对于每个交叉验证,我使用我的记分器进行改装,以便比较模型和数据集之间的结果。对于我迄今为止测试过的模型,我的mean_test_amelioration
范围从 +42% 到 +114%。
最后,我将测量所选模型在测试样本上的性能并报告结果。
我想这对专业人士来说可能会觉得很麻烦(而且我可能正在建造一辆坦克来杀死苍蝇),但我已经以这种方式学到了很多东西。
我只是比较所有这些模型,mean_test_amelioration
并没有考虑标准错误(例如)。这会导致过度拟合,使我的最终模型不能很好地泛化吗?如果是,我如何考虑可变性?
任何教育链接也非常受欢迎。
PS:因为这可能是相关的,这是我的自定义记分器代码:
def get_amelioration(y_true, y_pred, **kwargs):
"""
If I select 30% of my sample with this algorithm, I will have
`amelioration`% more positives in my selection than without
:use as: make_scorer(get_amelioration, needs_proba=True, N=30)
"""
N = kwargs.pop('N', False)
if kwargs: raise TypeError('Unexpected **kwargs: %r' % kwargs)
decisions = (y_pred > np.percentile(y_pred, 100-N)).astype(int)
tn, fp, fn, tp = metrics.confusion_matrix(y_true, decisions).ravel()
v = (fp+tp)/(tn+fp+fn+tp)
r = tp/(fp+tp)
r_base = np.mean(y_true) #around 15% in my sample, expected to be stable
amelioration = 100*(r/r_base-1)
# print("N=%i, v=%0.3f, amelioration=%0.3f" %(N,v, amelioration))
if v<0.75*N/100: return 0
return amelioration