最近我一直在尝试对矢量化文本数据进行正则化Logistic回归。我首先尝试使用sklearn
,没有问题,但是后来发现并且无法通过sklearn进行推理,因此我尝试切换到statsmodels
。问题是,当我尝试安装logit时,它将永远运行并使用约95%的RAM(在8GB和16GB RAM计算机上都尝试过)。
我的第一个猜测是它与尺寸有关,因为我正在使用2960 x 43k矩阵。因此,为了减少它,我删除了bigrams并仅采样了100个观测值,这给了我100×6984的矩阵,我认为应该不会有太大问题。
这是我的代码的一些示例:
for train_index, test_index in sss.split(df_modelo.Cuerpo, df_modelo.Dummy_genero):
X_train, X_test = df_modelo.Cuerpo[train_index], df_modelo.Cuerpo[test_index]
y_train, y_test = df_modelo.Dummy_genero[train_index], df_modelo.Dummy_genero[test_index]
cvectorizer=CountVectorizer(max_df=0.97, min_df=3, ngram_range=(1,1) )
vec=cvectorizer.fit(X_train)
X_train_vectorized = vec.transform(X_train)
这为我提供了训练和测试集,然后将X_train中的文本向量化。 然后我尝试:
import statsmodels.api as sm
logit=sm.Logit(y_train.values,X_train_vectorized.todense())
result=logit.fit_regularized(method='l1')
一切正常,直到result
行一直持续运行为止。有什么我可以做的吗?如果我要进行统计推断,应该切换到R吗?
谢谢!
答案 0 :(得分:1)
几乎所有的stats模型和所有推论都是针对观察数比要素数大得多的情况而设计的。
Logit.fit_regularized
使用带有scipy优化器的内部点算法,该算法需要将所有功能都保留在内存中。参数推论需要参数估计值的协方差,其形状为n_features乘n_features。设计该功能的用例是特征数量相对于观察数量相对较少,并且可以在内存中使用Hessian。
GLM.fit_regularized
估计弹性净罚分参数并使用坐标下降。这可能可以处理大量功能,但没有任何可用的推论结果。
仅在最近的研究中才得出在套索和类似的惩罚之后选择变量的推论。例如,参见Python https://github.com/selective-inference/Python-software中的选择性推断,该案例也提供了R包。