2017-06-26 23 views
2

私はlasso回帰をPythonで使用しようとしています。 私は現在scikit-learnライブラリでlasso関数を使用しています。特定の変数にペナルティを課さないようにlasso回帰を設定するにはどうすればよいですか?

トレーニング中に特定の変数にペナルティをかけないようにしたい。以下は(変数の唯一の残りの部分を罰する)

は、訓練のための私の現在のコードである

rg_mdt = linear_model.LassoCV(alphas=np.array(10**np.linspace(0, -4, 100)), fit_intercept=True, normalize=True, cv=10) 
rg_mdt.fit(df_mdt_rgmt.loc[df_mdt_rgmt.CLUSTER_ID == k].drop(['RESPONSE', 'CLUSTER_ID'], axis=1), df_mdt_rgmt.loc[df_mdt_rgmt.CLUSTER_ID == k, 'RESPONSE']) 

df_mdt_rgmtは、データマートであり、私は特定の列非ゼロのための係数を維持しようとしています。

glmnetは、これを行うための 'ペナルティファクタ'パラメータを提供しますが、私はそれをどのようにpython scikit-learnで行うことができますか?以下は

私はあなたがすることはできません怖いR

get.Lassomodel <- function(TB.EXP, TB.RSP){ 
    VT.PEN <- rep(1, ncol(TB.EXP)) 
    VT.PEN[which(colnames(TB.EXP) == "DC_RATE")] <- 0 
    VT.PEN[which(colnames(TB.EXP) == "FR_PRICE_PW_REP")] <- 0 

    VT.GRID <- 10^seq(0, -4, length=100) 

    REG.MOD <- cv.glmnet(as.matrix(TB.EXP), as.matrix(TB.RSP), alpha=1, 
    lambda=VT.GRID, penalty.factor=VT.PEN, nfolds=10, intercept=TRUE) 

    return(REG.MOD) 
} 

答えて

2

で私が持っているコードです。もちろん、それは理論的な問題ではなく、単に設計決定です。

私の推論が可能なAPIに基づいており、時には文書化されていない機能がありますがuser-guideはすでに1-因子ノルムの-すべてでこの問題を投稿しているため、この時間は私はあなたが必要なものがあるとは思いませんあなたの設定に応じて、sklearnのコード(CDチューニングについて少し怖い)を修正したり、scipy.optimizeを使ってカスタマイズされた目的を実装することもできます(後者は少し遅いかもしれませんが)。

次に、scipy.optimizeアプローチを示すいくつかの例を示します。私は傍受を取り除いて問題を単純化しました。

""" data """ 
import numpy as np 
from sklearn import datasets 
diabetes = datasets.load_diabetes() 
A = diabetes.data[:150] 
y = diabetes.target[:150] 
alpha=0.1 
weights=np.ones(A.shape[1]) 

""" sklearn """ 
from sklearn import linear_model 
clf = linear_model.Lasso(alpha=alpha, fit_intercept=False) 
clf.fit(A, y) 

""" scipy """ 
from scipy.optimize import minimize 
def lasso(x): # following sklearn's definition from user-guide! 
    return (1./(2*A.shape[0])) * np.square(np.linalg.norm(A.dot(x) - y, 2)) + alpha * np.linalg.norm(weights*x, 1) 

""" Test with weights = 1 """ 
x0 = np.zeros(A.shape[1]) 
res = minimize(lasso, x0, method='L-BFGS-B', options={'disp': False}) 
print('Equal weights') 
print(lasso(clf.coef_), clf.coef_[:5]) 
print(lasso(res.x), res.x[:5]) 

""" Test scipy-based with special weights """ 
weights[[0, 3, 5]] = 0.0 
res = minimize(lasso, x0, method='L-BFGS-B', options={'disp': False}) 
print('Specific weights') 
print(lasso(res.x), res.x[:5]) 

出力:

Equal weights 
12467.4614224 [-524.03922009 -75.41111354 820.0330707 40.08184085 -307.86020107] 
12467.6514697 [-526.7102518 -67.42487561 825.70158417 40.04699607 -271.02909258] 
Specific weights 
12362.6078842 [ -6.12843589e+02 -1.51628334e+01 8.47561732e+02 9.54387812e+01 
    -1.02957112e-05] 
関連する問題