glmnet で生成されたモデル係数を抽出し、それらから SQL クエリを作成したいと思います。この関数 は ' ' オブジェクトcoef(cv.glmnet.fit)
を生成します。dgCMatrix
を使用して行列に変換するとas.matrix
、変数名が失われ、係数値だけが残ります。
画面に係数を出力できることは知っていますが、データ フレームに名前を書き込むことは可能ですか?
これらの名前を抽出するのを手伝ってくれる人はいますか?
更新: 私の答えの最初の2つのコメントは両方とも正しいです。後世のために、答えを下に置いておきました。
次の答えは短く、機能し、他のパッケージは必要ありません。
tmp_coeffs <- coef(cv.glmnet.fit, s = "lambda.min")
data.frame(name = tmp_coeffs@Dimnames[[1]][tmp_coeffs@i + 1], coefficient = tmp_coeffs@x)
+1 の理由は、@i
メソッドがインターセプトに対して 0 からインデックスを付けます@Dimnames[[1]]
が、1 から開始するためです。
OLD ANSWER: (後世のためにのみ保持) 次の行を試してください:
非ゼロ係数:
coef(cv.glmnet.fit, s = "lambda.min")[which(coef(cv.glmnet.fit, s = "lambda.min") != 0)]
選択された機能:
colnames(regression_data)[which(coef(cv.glmnet.fit, s = "lambda.min") != 0)]
次に、それらをデータフレームとしてまとめることは簡単ですが、コードのその部分も必要な場合はお知らせください。
名前は としてアクセスできる必要があるdimnames(coef(cv.glmnet.fit))[[1]]
ため、次のように係数の名前と値の両方を data.frame に入れる必要があります。
data.frame(coef.name = dimnames(coef(GLMNET))[[1]], coef.value = matrix(coef(GLMNET)))
ほうきのパッケージを確認してください。tidy
さまざまな R オブジェクト ( を含むglmnet
) の出力を data.framesに変換する機能があります。
上記のMehradのソリューションに基づいて、ゼロ以外の係数のみを含むテーブルを出力する単純な関数を次に示します。
print_glmnet_coefs <- function(cvfit, s="lambda.min") {
ind <- which(coef(cvfit, s=s) != 0)
df <- data.frame(
feature=rownames(coef(cvfit, s=s))[ind],
coeficient=coef(cvfit, s=s)[ind]
)
kable(df)
}
上記の関数はkable()
、knitr の関数を使用して、Markdown 対応のテーブルを生成します。
coef()をglmnet()オブジェクト (モデル)に使用するアプローチがあります。インデックス [[1]] 以下の場合、多項ロジスティック回帰の結果クラスの数を示します。おそらく他のモデルでは、それを削除する必要があります。
coef_names_GLMnet <- coef(GLMnet, s = 0)[[1]]
row.names(coef_names_GLMnet)[coef_names_GLMnet@i+1]
このような場合のrow.names()インデックスは、 coef()オブジェクト内の変数 (データ機能) の数値が 0 から始まるため、インクリメント (+1) する必要がありますが、変換後の文字ベクトルの数値は 1 から始まります。
# requires tibble.
tidy_coef <- function(x){
coef(x) %>%
matrix %>% # Coerce from sparse matrix to regular matrix.
data.frame %>% # Then dataframes.
rownames_to_column %>% # Add rownames as explicit variables.
setNames(c("term","estimate"))
}
ティブルなし:
tidy_coef2 <- function(x){
x <- coef(x)
data.frame(term=rownames(x),
estimate=matrix(x)[,1],
stringsAsFactors = FALSE)
}
I faced a similar issue when using glmnet
from the tidymodels
framework, where the model was trained within a workflow and neither coef()
nor the above solutions worked.
What worked for me though, was part of the glmnet:::coef.glmnet
code:
# taken from glmnet:::coef.glmnet
coefs <- predict(x, "lambda.min", type = "coefficients", exact = FALSE)
dd <- cbind(
data.frame(var = rownames(coefs)),
as.data.table(as.matrix(coefs))
)