请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

学习曲线很诡异

图片描述bobo老师,为什么我画出来的学习曲线和您画的完全不一样。。。我拷贝的是您的代码。
import matplotlib.pyplot as plt
from itertools import cycle
from sklearn import svm
from sklearn.metrics import roc_curve, auc
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
from sklearn.decomposition import KernelPCA
matrix = np.loadtxt(‘Matrix.txt’)
#数据标准化
standardscaler=StandardScaler()
matrix=standardscaler.fit_transform(matrix)
y=96*[0]+118*[1]
y=np.array(y)
#降维
gamma=0.0018
kpca = KernelPCA(n_components=20,kernel=‘rbf’,gamma=gamma)
X= kpca.fit_transform(matrix)

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)
clf = svm.SVC(kernel=‘rbf’,gamma=0.001, random_state=10)
def plot_learning_curve(algo, X_train, X_test, y_train, y_test):
train_score = []
test_score = []
for i in range(5, len(X_train) + 1):
algo.fit(X_train[:i], y_train[:i])
y_train_predict = algo.predict(X_train[:i])
train_score.append(mean_squared_error(y_train[:i], y_train_predict))
y_test_predict = algo.predict(X_test)
test_score.append(mean_squared_error(y_test, y_test_predict))

plt.plot([i for i in range(5, len(X_train) + 1)],
         np.sqrt(train_score), label="train")
plt.plot([i for i in range(5, len(X_train) + 1)],
         np.sqrt(test_score), label="test")
plt.legend()
plt.axis([0, len(X_train) + 1, 0, 4])
plt.ylim([0.0, 1.0])
plt.show()

plot_learning_curve(clf, X_train, X_test, y_train, y_test)
matrix中的数据是一万维的,我用kpca先将这些数据降成20维,然后用svm分类。由于svm分类必须得有两种标签值(两类),如果i从1开始取的话,那喂给svm的数据就只有一个,即1种种类,那它就报错(具体的我也不清楚,反正我从i=5开始取),当我取svm中gamma不同的值时(一个取10,一个取0.001),然后我画出来的学习曲线就非常诡异。。。根本就不知道我画出的这个学习曲线意味着什么。。
图片描述

正在回答

1回答

不管学习曲线的形状看起来多诡异,他表示的意思是不变的:就是随着数据量的增多,你的纵坐标的所表示的那个量,在如何变化。


首先,如果你是用和我完全一样的代码,应该可以画出和我一样的学习曲线。这一小节的课程代码可以参考:https://github.com/liuyubobobo/Play-with-Machine-Learning-Algorithms/blob/master/08-Polynomial-Regression-and-Model-Generalization/05-Learning-Curve/05-Learning-Curve.ipynb


注意,我在课程中的纵坐标,取得是误差值(mean_squared_error)而非准确度(score),我看到你的最后一个图的纵坐标是准确度。


其实,纵坐标是什么并不重要。因为学习曲线就是随着数据量的增大,纵坐标的那个量怎么变化。由于机器学习本身不是精确的数学,而是基于统计学的,所以,一切的一切,样本数据是关键!假设你的代码完全正确,在实际中,你绘制出一条“诡异的”曲线,让你觉得看不出规律,或者规律不明显,是很正常的!怎么办?加大数据量!在机器学习的世界中,绝大多数问题的第一解决方案,是寻找更多,更高质量的数据,而非调整算法:)


数据的重要程度,比大多数人,尤其是初学者,想象的要重要得多。可以在回顾课程处时介绍的:没有免费的午餐定理。并没有一个算法比另一个算法决定性的好。但是,如果数据质量或者数据量有差距,绝对能是的算法的结果产生决定性的影响:)


加油!:)

2 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信