5 python classification machine-learning cross-validation train-test-split
在绘制学习曲线以查看模型构建的进展情况时,我意识到验证准确性曲线从一开始就是一条直线。我想这可能只是由于将数据分割为训练集和验证集时出现了一些错误,但是当我迭代 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')
Run Code Online (Sandbox Code Playgroud)
此代码生成以下图表:
任何帮助是极大的赞赏。谢谢。
首先,虽然您的实现看起来是正确的,但您应该验证learning_curve. 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)
Run Code Online (Sandbox Code Playgroud)
事实证明,您的实现是正确的(为了清楚起见,消除了偏差):
现在我们已经确定了实施情况,问题现在出在您的数据集中。我们需要领域知识来进行一些探索性数据分析(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)
Run Code Online (Sandbox Code Playgroud)
您会看到出现几乎相似的模式,如您的结果所示:
NB 你得到的分数无论如何都不低,准确率 >=90% 就被认为是非常好的了。
| 归档时间: |
|
| 查看次数: |
2030 次 |
| 最近记录: |