模型在迁移到 Azure 机器学习工作室时生成不同的结果
Models generate different results when moving to Azure Machine Learning Studio
我们在本地机器上开发了一个 Jupyter Notebook,以使用 Python (V3) 库 sklearn
和 gensim
训练模型。
当我们将 random_state
变量设置为固定整数时,结果始终相同。
在此之后,我们尝试将笔记本移动到 Azure 机器学习工作室(经典)中的工作区,但即使我们保持 random_state
不变,结果也会有所不同。
正如以下 link 中所建议的,我们安装了相同的库版本并检查了 MKL
版本是否相同并且 MKL_CBWR
变量设置为 AUTO
.
仍然,我们无法获得相同的结果。
我们还应该检查什么或为什么会发生这种情况?
更新
如果我们在本机生成一个pkl
文件,在AML中导入,结果是一样的(pkl文件的本意是)。
不过,我们希望在不导入 pkl 文件的情况下获得相同的结果(如果可能的话)。
库版本
gensim 3.8.3.
sklearn 0.19.2.
matplotlib 2.2.3.
numpy 1.17.2.
scipy 1.1.0.
代码
可以找到完整代码 here,示例数据 link 里面。
import pandas as pd
import numpy as np
import matplotlib
from matplotlib import pyplot as plt
from gensim.models import KeyedVectors
%matplotlib inline
import time
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
import seaborn as sns
wordvectors_file_vec = '../libraries/embeddings-new_large-general_3B_fasttext.vec'
wordvectors = KeyedVectors.load_word2vec_format(wordvectors_file_vec)
math_quests = # some transformations using wordvectors
df_subset = pd.DataFrame()
pca = PCA(n_components=3, random_state = 42)
pca_result = pca.fit_transform(mat_quests)
df_subset['pca-one'] = pca_result[:,0]
df_subset['pca-two'] = pca_result[:,1]
time_start = time.time()
tsne = TSNE(n_components=2, verbose=1, perplexity=40, n_iter=300, random_state = 42)
tsne_results = tsne.fit_transform(mat_quests)
df_subset['tsne-2d-one'] = tsne_results[:,0]
df_subset['tsne-2d-two'] = tsne_results[:,1]
pca_50 = PCA(n_components=50, random_state = 42)
pca_result_50 = pca_50.fit_transform(mat_quests)
print('Cumulative explained variation for 50 principal components: {}'.format(np.sum(pca_50.explained_variance_ratio_)))
time_start = time.time()
tsne = TSNE(n_components=2, verbose=0, perplexity=40, n_iter=300, random_state = 42)
tsne_pca_results = tsne.fit_transform(pca_result_50)
print('t-SNE done! Time elapsed: {} seconds'.format(time.time()-time_start))
绝对理解您遇到的问题。每个数据科学家都曾在某个时候为此苦苦挣扎过。
我要告诉你的是,Azure ML Studio(经典版)并不能真正解决这个 "works on my machine" 问题。不过,好消息是 Azure 机器学习服务在这方面的表现令人难以置信。 Studio classic 不允许您确定性地定义自定义环境,只能添加和删除包(即使那样也不太好)
由于 ML 服务的执行是建立在 Docker
容器和 conda
环境之上的,因此您可以对重复结果更有信心。我强烈建议您花时间学习它(我也很乐意调试出现的任何问题)。 Azure 的 MachineLearningNotebooks repo 有很多很棒的入门教程。
我花了两个小时 a proof of concept 来演示 ML 服务如何通过综合解决您遇到的问题:
- 您的代码示例(在您共享笔记本之前),
- Jake Vanderplas's sklearn example,以及
- this Azure ML tutorial 远程培训。
我不是 T-SNE 专家,但从下面的屏幕截图中,您可以看到当我在本地和远程 运行 脚本时,t-sne 输出是相同的。这对于 Studio classic 可能是可行的,但很难保证它始终有效。
我们在本地机器上开发了一个 Jupyter Notebook,以使用 Python (V3) 库 sklearn
和 gensim
训练模型。
当我们将 random_state
变量设置为固定整数时,结果始终相同。
在此之后,我们尝试将笔记本移动到 Azure 机器学习工作室(经典)中的工作区,但即使我们保持 random_state
不变,结果也会有所不同。
正如以下 link 中所建议的,我们安装了相同的库版本并检查了 MKL
版本是否相同并且 MKL_CBWR
变量设置为 AUTO
.
仍然,我们无法获得相同的结果。
我们还应该检查什么或为什么会发生这种情况?
更新
如果我们在本机生成一个pkl
文件,在AML中导入,结果是一样的(pkl文件的本意是)。
不过,我们希望在不导入 pkl 文件的情况下获得相同的结果(如果可能的话)。
库版本
gensim 3.8.3.
sklearn 0.19.2.
matplotlib 2.2.3.
numpy 1.17.2.
scipy 1.1.0.
代码
可以找到完整代码 here,示例数据 link 里面。
import pandas as pd
import numpy as np
import matplotlib
from matplotlib import pyplot as plt
from gensim.models import KeyedVectors
%matplotlib inline
import time
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
import seaborn as sns
wordvectors_file_vec = '../libraries/embeddings-new_large-general_3B_fasttext.vec'
wordvectors = KeyedVectors.load_word2vec_format(wordvectors_file_vec)
math_quests = # some transformations using wordvectors
df_subset = pd.DataFrame()
pca = PCA(n_components=3, random_state = 42)
pca_result = pca.fit_transform(mat_quests)
df_subset['pca-one'] = pca_result[:,0]
df_subset['pca-two'] = pca_result[:,1]
time_start = time.time()
tsne = TSNE(n_components=2, verbose=1, perplexity=40, n_iter=300, random_state = 42)
tsne_results = tsne.fit_transform(mat_quests)
df_subset['tsne-2d-one'] = tsne_results[:,0]
df_subset['tsne-2d-two'] = tsne_results[:,1]
pca_50 = PCA(n_components=50, random_state = 42)
pca_result_50 = pca_50.fit_transform(mat_quests)
print('Cumulative explained variation for 50 principal components: {}'.format(np.sum(pca_50.explained_variance_ratio_)))
time_start = time.time()
tsne = TSNE(n_components=2, verbose=0, perplexity=40, n_iter=300, random_state = 42)
tsne_pca_results = tsne.fit_transform(pca_result_50)
print('t-SNE done! Time elapsed: {} seconds'.format(time.time()-time_start))
绝对理解您遇到的问题。每个数据科学家都曾在某个时候为此苦苦挣扎过。
我要告诉你的是,Azure ML Studio(经典版)并不能真正解决这个 "works on my machine" 问题。不过,好消息是 Azure 机器学习服务在这方面的表现令人难以置信。 Studio classic 不允许您确定性地定义自定义环境,只能添加和删除包(即使那样也不太好)
由于 ML 服务的执行是建立在 Docker
容器和 conda
环境之上的,因此您可以对重复结果更有信心。我强烈建议您花时间学习它(我也很乐意调试出现的任何问题)。 Azure 的 MachineLearningNotebooks repo 有很多很棒的入门教程。
我花了两个小时 a proof of concept 来演示 ML 服务如何通过综合解决您遇到的问题:
- 您的代码示例(在您共享笔记本之前),
- Jake Vanderplas's sklearn example,以及
- this Azure ML tutorial 远程培训。
我不是 T-SNE 专家,但从下面的屏幕截图中,您可以看到当我在本地和远程 运行 脚本时,t-sne 输出是相同的。这对于 Studio classic 可能是可行的,但很难保证它始终有效。