我正在尝试优化嵌入训练的轮数(epochs)。有没有办法为这个过程生成一个学习曲线呢?
例如,我可以为常规的监督分类创建学习曲线。
import numpy as npimport matplotlib.pyplot as pltfrom sklearn.model_selection import learning_curvefrom sklearn.model_selection import StratifiedShuffleSplitdef plot_learning_curve(estimator, title, X, y, ylim=None, cv=None, n_jobs=None, train_sizes=np.linspace(.1, 1.0, 5)): plt.figure() plt.title(title) if ylim is not None: plt.ylim(*ylim) plt.xlabel("训练样本") plt.ylabel("得分") train_sizes, train_scores, test_scores = learning_curve( estimator, X, y, cv=cv, n_jobs=n_jobs, train_sizes=train_sizes) train_scores_mean = np.mean(train_scores, axis=1) train_scores_std = np.std(train_scores, axis=1) test_scores_mean = np.mean(test_scores, axis=1) test_scores_std = np.std(test_scores, axis=1) plt.grid() plt.fill_between(train_sizes, train_scores_mean - train_scores_std, train_scores_mean + train_scores_std, alpha=0.1, color="r") plt.fill_between(train_sizes, test_scores_mean - test_scores_std, test_scores_mean + test_scores_std, alpha=0.1, color="g") plt.plot(train_sizes, train_scores_mean, 'o-', color="r", label="训练得分") plt.plot(train_sizes, test_scores_mean, 'o-', color="g", label="交叉验证得分") plt.legend(loc="best") return plttitle = "学习曲线 (SGDClassifier)"cv = StratifiedShuffleSplit(n_splits=1, test_size=0.2, random_state=0)estimator = SGDClassifier()plot_learning_curve(estimator, title, X_all.todense(), y, ylim=(0.7, 1.01), cv=cv, n_jobs=4)
还有,我可以训练一个嵌入,例如。
from gensim.models.doc2vec import Doc2Vec, TaggedDocumentfrom nltk.tokenize import word_tokenizeX_tagged = [TaggedDocument(words=word_tokenize(_d.lower()), tags=[str(i)]) for i, _d in enumerate(X)]model = Doc2Vec(size=8, alpha=0.05, min_alpha=0.00025, dm =1)model.build_vocab(X_tagged)model_title.train(X_tagged, total_examples=model.corpus_count, epochs=50)
但是,我如何在训练嵌入时创建学习曲线呢?
我对训练嵌入的直觉不足以解决这个问题。
回答:
通常,学习曲线会绘制模型的性能(以某种定量得分表示,如“准确率”)与不同数量的训练数据的关系。
因此,你需要选择一种方法来评分你的Doc2Vec
模型。(可能这是通过使用文档向量作为另一个分类的输入,或者其他方法。)然后,你需要用不同大小的训练集重新创建Doc2Vec
模型,对每个模型进行评分,并将(corpus_size, score)
数据点提供给绘图程序。
请注意,gensim
包含了一个包装类,可以将Doc2Vec
训练步骤插入到scikit-learn
管道中:
https://radimrehurek.com/gensim/sklearn_api/d2vmodel.html
因此,你可以用一个多步骤的管道替换你现有代码中的简单estimator
,包括D2VTransformer
作为一个步骤。这样,你就可以以一种与你现有代码非常相似的方式创建学习曲线图。