问题描述
我有大约50个州的数据(很多属性)。对于每个状态,我想找到从逻辑回归得出最小RMSE的属性组合。由于存在许多属性和状态,因此我要遍历约5100万个状态和自变量的组合。我试图用numpy编写函数,但是我需要对向量进行矢量化的帮助。我有这样的东西:
import pandas as pd
import numpy as np
import random
import statsmodels.api as sm
import itertools
rows = 20000
total_rows = 13*rows
data = pd.DataFrame({
'state': ['a','b','c','d','e','f','g','h','i','j','k','l','m']*rows,'y_var': [random.uniform(0,1) for i in range(total_rows)],'school': [random.uniform(0,10) for i in range(total_rows)],'church': [random.uniform(11,20) for i in range(total_rows)],'bar': [random.uniform(2,'mosque': [random.uniform(10,50) for i in range(total_rows)],'office': [random.uniform(0,'cafe': [random.uniform(11,'mall': [random.uniform(2,'washroom': [random.uniform(10,'bedroom': [random.uniform(0,'hotel': [random.uniform(11,'car': [random.uniform(2,'mailroom': [random.uniform(2,'motel': [random.uniform(10,'bank': [random.uniform(0,'trailer': [random.uniform(11,'camp': [random.uniform(2,'sample': [1]*int(0.8*total_rows)+ [0]*int(0.2*total_rows)
}).to_numpy()
ind_variables = [i for i in range(2,18)]
combinations = np.array(
[np.array(b) for b in [c for i in range(len(ind_variables)+1) for c in itertools.combinations(ind_variables,i)]]
)[1:]
states = np.unique(data[:,0])
def reg_frac(state,ind_vars):
try:
x_train,y_train = sm.add_constant(np.array(data[(data[:,18] == 1) & (data[:,0] == state)][:,ind_vars],dtype=float)),np.array(data[(data[:,0] == state),1],dtype=float)
x_test,y_test = sm.add_constant(np.array(data[(data[:,18] == 0) & (data[:,data[(data[:,1]
model = sm.Logit(y_train,x_train).fit(cov_type='HC0',disp=False)
rmse = np.sqrt(np.square(np.subtract(y_test,model.predict(x_test))).mean())
except:
rmse = np.nan
return [state,ind_vars,rmse]
我尝试过itertools,itertuples,map等,它们都很慢。有没有一种有效的方法可以遍历所有状态和自变量,而不必花几个小时?我还可以获得矢量化功能的帮助吗?我相信这可以加快速度。谢谢
解决方法
有很多方法可以优化这些类型的事物,这取决于许多因素,因此将涉及一些反复试验。一些快速的方法是尝试使用Numba并通过JIT对其进行编译。您还可以使用Numba进行矢量化,这将提供最快的速度,并在允许的情况下允许GPU编译。
此外,创建numpy数组非常昂贵,因此在add_constant部分中这样做非常昂贵。另外,由于您的数据已经是一个numpy数组,因此您无需将其子集转换为该行中的数组。
为了最大程度地提高速度,您可能不得不转向像Cython这样的编译方法,但这将需要大量工作;与Numba相比非常快捷,容易。
伴随@Dan的评论,LR中的特征选择方法比测试每个组合要有效得多。查看Sklearns Kbest