如何在学习曲线图中创建平坦的验证精度曲线

2024-06-06 20:46:43 发布

您现在位置:Python中文网/ 问答频道 /正文

在绘制学习曲线以查看模型构建的进展情况时,我意识到验证精度曲线是一条从开始到结束的直线。我想这可能是因为将数据拆分为训练集和验证集时出现了一些错误,但当我迭代100次时,仍然会得到大致相同的图形

我如何解释这一点?发生什么事?我计算准确度分数的方法有错误吗

此外,精度不高,开始,我怀疑我的模型是不合适的,有没有任何明显的方法,我可以改善它?(我无法获得更多的数据,那么特征工程就是这样吗?)

我使用下面的代码来计算精度

def learning_curve():
    
    X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.33)
    
    training_sizes = (np.linspace(0.1, 1.0, 100) * len(X_train)).astype(int)
    
    train_accuracy = []
    valid_accuracy = []
    
    clf = LogisticRegression(solver='liblinear')
    
    for size in training_sizes:
        clf.fit(X_train.iloc[:size], y_train.iloc[:size])
        train_accuracy.append(clf.score(X_train.iloc[:size], y_train.iloc[:size]))
        valid_accuracy.append(clf.score(X_valid, y_valid))
        
    return training_sizes, train_accuracy, valid_accuracy
    

training_scores = []
cross_val_scores = []
    
for i in range(num_iter):
    sizes, train_score, cross_valid_score = learning_curve()
    training_scores.append(train_score)
    cross_val_scores.append(cross_valid_score)
    
train_std = np.std(training_scores, axis=0)
train_mean = np.mean(training_scores, axis=0)
cv_std = np.std(cross_val_scores, axis=0)
cv_mean = np.mean(cross_val_scores, axis=0)
    
plt.plot(sizes, train_mean, '--', color="b",  label="Training score") 
plt.plot(sizes, cv_mean, color="g", label="Cross validation score") 
   
plt.fill_between(sizes, train_mean - train_std, train_mean + train_std, color='gray')
plt.fill_between(sizes, cv_mean - cv_std, cv_mean + cv_std, color='gray')

此代码生成以下图形:

enter image description here

非常感谢您的帮助。多谢各位


Tags: sizenptrainingtrainmeancvscorestd
1条回答
网友
1楼 · 发布于 2024-06-06 20:46:43

首先,尽管您的实现看起来是正确的,但您应该验证learning_curve的实现。一个快速的方法是将它与Scikit Learn已经制作的^{}函数进行比较(旁注:如果我是你,你不需要重新发明轮子,我只会使用Scikit Learn的一个

因为您没有提供任何数据,所以我必须创建一些分类数据集

X, y = make_classification(n_samples=1000, n_features=5, n_informative=5, 
                           n_redundant=0, n_repeated=0, n_classes=2, 
                           shuffle=True, random_state=2020)

事实证明,您的实现是正确的(为了清晰起见,消除了偏差):

enter image description hereenter image description here


现在,我们已经确定了实现,问题就在您的数据集中。我们需要领域知识来进行一些探索性数据分析(EDA)

您的数据可能有冗余信息,这会增加很多噪音

如果我重复同样的实验,但是这次我创建了很多冗余数据

X, y = make_classification(n_samples=1000, n_features=5, n_informative=2, 
                           n_redundant=3, n_repeated=0, n_classes=2, 
                           shuffle=True, random_state=2020)

您将看到出现几乎类似的模式,如您的结果所示:

enter image description here

注意:你得到的分数无论如何都不低,准确率>=90%被认为是非常好的


总结

  1. 您的实现是正确的
  2. 问题最有可能出现在数据集中(例如,冗余特征)
  3. 建议的解决方案太多,无法包含在这里,尤其是在不了解数据集的情况下,因为它需要EDA和领域知识(以herehere为起点)

相关问题 更多 >