sklearn 逻辑回归中的特征

Posted

技术标签:

【中文标题】sklearn 逻辑回归中的特征【英文标题】:Features in sklearn logistic regression 【发布时间】:2014-01-19 02:52:14 【问题描述】:

我在向 sklearn.linear_model.LogisticRegression 添加自己的功能时遇到了一些问题。但无论如何让我们看看一些示例代码:

from sklearn.linear_model import LogisticRegression, LinearRegression
import numpy as np

#Numbers are class of tag
resultsNER = np.array([1,2,3,4,5])

#Acording to resultNER every row is another class so is another features
#but in this way every row have the same features
xNER = np.array([[1.,0.,0.,0.,-1.,1.],
                 [1.,0.,1.,0.,0.,1.],
                 [1.,1.,1.,1.,1.,1.],
                 [0.,0.,0.,0.,0.,0.],
                 [1.,1.,1.,0.,0.,0.]])

#Assing resultsNER to y
y = resultsNER
#Create LogReg
logit = LogisticRegression(C=1.0)
#Learn LogReg
logit.fit(xNER,y)

#Some test vector to check wich class will be predict
xPP = np.array([1.,1.,1.,0.,0.,1.])

#linear = LinearRegression()
#linear.fit(x, y)

print "expected: ", y
print "predicted:", logit.predict(xPP)
print "decision: ",logit.decision_function(xNER)
print logit.coef_
#print linear.predict(x)
print "params: ",logit.get_params(deep=True)

上面的代码清晰易懂。所以我有一些我称之为 1,2,3,4,5(resultsNER) 的类,它们与“数据”、“人”、“组织”等一些类有关。所以对于每个类,我都制作了返回的自定义功能真或假,在本例中为 1 和 0 数字。示例:如果 token 等于“(S|s)unday”,则为数据类。数学上很清楚。我测试的每个类功能都有令牌。然后我查看哪个类的特征总和的最大值(这就是返回数字不是布尔值的原因)并选择它。换句话说,我使用 argmax 函数。当然,总而言之,每个特征都有 alpha 系数。在这种情况下它是多类分类,所以我需要知道如何将多类特征添加到 sklearn.LogisticRegression。

我需要两件事,阿尔法系数并将我自己的特征添加到逻辑回归中。对我来说最重要的是如何在sklearn.LogisticRegression 中为每个类添加我自己的功能。

我知道我可以通过梯度下降来计算系数。但我认为当我使用 fit(x,y) 时,LogisticRegression 使用一些算法来计算我可以通过属性获得的系数 .coef_.

所以最后我的主要问题是如何在我的示例类 1、2、3、4、5(resultNER)中为不同的类添加自定义功能。

【问题讨论】:

你的问题很不清楚。尝试改写它,因为它的方式没有意义。学习算法(在这种情况下为回归)与特征提取几乎没有关系。阅读scikit-learn.org/stable/modules/feature_extraction.html。您的代码在包含 5 个点的数据集上学习了拟合,每个点代表一个类,这意味着它非常过度拟合。您为进行逻辑测试而给出的向量解析为 nr 类。 3,这是您所期望的,而不是标签数组y 【参考方案1】:

不太确定您的问题,但几乎没有什么可以帮助您:

您可以使用predict_proba 函数来估计每个类的概率:

>>> logit.predict_proba(xPP)
array([[ 0.1756304 ,  0.22633999,  0.25149571,  0.10134168,  0.24519222]])

如果您希望特征具有一些权重(这就是您所说的 alpha 吗?),您不是在学习算法中而是在 preprocessing phase 上这样做。在您的情况下,您可以使用一系列系数:

>>> logit = LogisticRegression(C=1.0).fit(xNER,y)
>>> logit.predict(xPP)
array([3])
>>> alpha = np.array([[0.2, 0.2, 1, 1, 0.3, 1]])
>>> logit = LogisticRegression(C=1.0).fit(alpha*xNER,y)
>>> logit.predict(alpha*xPP)
array([2])

【讨论】:

简而言之:我想向 LogisticRegression 添加特征函数。如果我是正确的,根据参考文档,有一个名为 DecisionFunction 的函数。就像这样:如果第一个字母是大写,则返回 1。每个类都有自己的一组特征函数。当我想到这一点时,最好的方法是在 LogisticRegression 之外制作特征行,并且只告诉它每个类有不同的特征函数和不同数量的特征函数。是的,我称之为权重而不是 alpha。

以上是关于sklearn 逻辑回归中的特征的主要内容,如果未能解决你的问题,请参考以下文章

解释 sklearn 中的逻辑回归特征系数值

详解逻辑回归与评分卡-逻辑回归中的特征工程菜菜的sklearn课堂笔记

在 sklearn 逻辑回归中使用分类数据作为特征

Python SKLearn 逻辑回归中的虚拟变量

sklearn逻辑回归实战

逻辑回归推导