gpt4 book ai didi

python - 我可以安全地分配给 `coef_` 和 scikit-learn 中的其他估计参数吗?

转载 作者:太空狗 更新时间:2023-10-30 02:38:40 25 4
gpt4 key购买 nike

scikit-学习 suggests使用 pickle 进行模型持久化。然而,当涉及到不同版本的 scikit-learn 或 python 时,他们注意到 pickle 的局限性。 (另请参阅 this stackoverflow question)

在许多机器学习方法中,只有少数参数是从大型数据集中学习的。这些估计参数存储在属性中 trailing underscore ,例如系数_

现在我的问题是:是否可以通过持久化估计的属性并在以后分配给它们来实现模型持久化?这种方法对于 scikit-learn 中的所有估计器 是否安全,或者对于某些估计器是否存在潜在的副作用(例如必须设置的私有(private)变量)?

它似乎适用于逻辑回归,如以下示例所示:

from sklearn import datasets
from sklearn.linear_model import LogisticRegression
try:
from sklearn.model_selection import train_test_split
except ImportError:
from sklearn.cross_validation import train_test_split
iris = datasets.load_iris()
tt_split = train_test_split(iris.data, iris.target, test_size=0.4)
X_train, X_test, y_train, y_test = tt_split

# Here we train the logistic regression
lr = LogisticRegression(class_weight='balanced')
lr.fit(X_train, y_train)
print(lr.score(X_test, y_test)) # prints 0.95

# Persisting
params = lr.get_params()
coef = lr.coef_
intercept = lr.intercept_
# classes_ is not documented as public member,
# but not explicitely private (not starting with underscore)
classes = lr.classes_
lr.n_iter_ #This is meta-data. No need to persist


# Now we try to load the Classifier
lr2 = LogisticRegression()
lr2.set_params(**params)
lr2.coef_ = coef
lr2.intercept_ = intercept
lr2.classes_ = classes
print(lr2.score(X_test, y_test)) #Prints the same: 0.95

最佳答案

单独设置估计属性是不够的 - 至少在一般情况下对于所有估计器

我知道至少有一个这样的例子会失败。 LinearDiscriminantAnalysis.transform() 使用私有(private)属性 _max_components :

def transform(self, X):
# ... code omitted
return X_new[:, :self._max_components]

但是,它可能适用于某些估算器。如果你只需要一个特定的估计器,最好的方法是查看估计器源代码并保存在 __init__() 中设置的所有属性。和 .fit()方法。

一种更通用的方法可能是将所有项目保存在估算器的 .__dict__ 中。 .例如:

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
lda = LDA().fit([[1, 2, 3], [1, 2, 1], [4, 5, 6], [9, 9, 9]], [1, 2, 1, 2])
lda.__dict__
# {'_max_components': 1,
# 'classes_': array([1, 2]),
# 'coef_': array([[ -9.55555556, 21.55555556, -9.55555556]]),
# 'explained_variance_ratio_': array([ 1.]),
# 'intercept_': array([-15.77777778]),
# 'means_': array([[ 2.5, 3.5, 4.5],
# [ 5. , 5.5, 5. ]]),
# 'n_components': None,
# 'priors': None,
# 'priors_': array([ 0.5, 0.5]),
# 'scalings_': array([[-2.51423299],
# [ 5.67164186],
# [-2.51423299]]),
# 'shrinkage': None,
# 'solver': 'svd',
# 'store_covariance': False,
# 'tol': 0.0001,
# 'xbar_': array([ 3.75, 4.5 , 4.75])}

对于包含更复杂数据的估算器(例如包含多个估算器的集成)而言,这并非易事。请参阅博文 Scikit-learn Pipeline Persistence and JSON Serialization了解更多详情。

不幸的是,这不会安全地将估算器转移到新版本的 scikit-learn。私有(private)属性本质上是一个实现细节,可以在发布之间随时更改。

关于python - 我可以安全地分配给 `coef_` 和 scikit-learn 中的其他估计参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46316031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com