我有一个与Lasso的惩罚回归模型有关的问题,并解释了返回值。我有文本内容,想要找到每个类最具预测性的单词。
代码和数据
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from nltk.corpus import stopwords
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.linear_model import Lasso
# Import test data
data = pd.read_csv('https://pastebin.com/raw/rXr4kd8S')
# Make ngrams
vectorizer = CountVectorizer(min_df=0.00, max_df=1.0, max_features=1000, stop_words='english', binary=True, lowercase=True, ngram_range=(1, 1))
grams = vectorizer.fit_transform(data['text'])
# Show features (words)
vectorizer.get_feature_names()
# Show Lasso coefficients
def lassoRegression(para1, para2):
lasso = Lasso(alpha = 0, fit_intercept=True, normalize=True, max_iter=1000)
lasso.fit(para1, para2)
return lasso.coef_
model_lasso = lassoRegression(grams, data['label'])
# Sort coefficients
lasso_coef = pd.DataFrame(np.round_(model_lasso, decimals=2), vectorizer.get_feature_names(), columns = ["penalized_regression_coefficients"])
lasso_coef = lasso_coef[lasso_coef['penalized_regression_coefficients'] != 0]
lasso_coef = lasso_coef.sort_values(by = 'penalized_regression_coefficients', ascending = False)
lasso_coef
# Top/Low 10 values
lasso_coef = pd.concat([lasso_coef.head(10),lasso_coef.tail(10)], axis=0)
# Plot
ax = sns.barplot(x = 'penalized_regression_coefficients', y= lasso_coef.index , data=lasso_coef)
ax.set(xlabel='Penalized Regression Coeff.')
plt.show()
更改alpha会导致以下问题:
Out:对于Lasso(alpha = 0,...)
ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations. Fitting data with very small alpha may cause precision problems.
penalized_regression_coefficients
data 0.62
awesome 0.33
content 0.31
performs 0.05
enter 0.02
great -0.01
Out:对于Lasso(alpha = 0.001,...)
penalized_regression_coefficients
great -0.93
Out:对于Lasso(alpha = 1,...)
penalized_regression_coefficients
empty
问题:
alpha = 0
返回错误(但值),任何其他alpha设置几乎不返回任何内容。考虑到输入数据,即使在删除停用词后,我也会期望更多的单词具有相应的正负权重。这里有问题吗?请注意,数据输入具有故意重复的元素,因为我希望以这种方式测试模型的可靠性。谢谢!
答案 0 :(得分:1)
alpha
是指弹性网上的惩罚。称为lambda
或alpha
。 alpha=0
相当于普通的最小二乘法。套索回归和力系数趋向于0.系数越小,它就越不重要,或者解释的方差越小。这里的实际值不太重要,因为它将用于逻辑回归,因为它最终会以指数形式使用。所以你最后的假设是非常正确的,如果系数是正确的,那么该变量表示每个出现该单词的probability of label 1
更高。
至于你的套索回归为什么不会收敛,你可以阅读here
我建议在使用之前更多地阅读这些方法。 This course谈论了很多关于统计数据的内容,并解释了为什么以及何时使用套索回归。如果您熟悉OLS,那么您可以理解系数的解释。如果所有其他变量保持不变,则对于1个变量数据的每个增加,您可以预期响应变量 Y 平均增加0.62。但正如我之前所说,这将导致在逻辑方程中使用时的百分比变化。
请参阅Cross Validation以获取有关统计数据的更多帮助。
答案 1 :(得分:1)
好的,这里有一些事情。
我发现您的逻辑回归在脚本中没有使用。您可能想要考虑使用线性v / s逻辑回归。
代码试图告诉你接近alpha = 0,Lasso回归结果不可靠。为什么会这样?好吧,如果你去套索的代码,你最终会到达 - this answer第516行,在那里进行浮动比较。
当你的alpha慢慢走向0时,这是什么意思?那么这意味着你的回归类似于OLS回归。现在,如果你的系数很快消失,那就意味着你的系数在解释结果时非常弱。
您的TODO列表 - 1.尝试使用OLS和Logistic来查看哪一个更合适 2.查看t统计数据,看看是否有任何重要结果 3.如果没有什么重要,那么可以看看如何设置回归,代码中可能存在错误。 4.如果任何概念不清楚,请转到@lwileczek提到的课程