加快迭代或向量化

问题描述

我有大约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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...