38

glmnet で生成されたモデル係数を抽出し、それらから SQL クエリを作成したいと思います。この関数 は ' ' オブジェクトcoef(cv.glmnet.fit) を生成します。dgCMatrixを使用して行列に変換するとas.matrix、変数名が失われ、係数値だけが残ります。

画面に係数を出力できることは知っていますが、データ フレームに名前を書き込むことは可能ですか?

これらの名前を抽出するのを手伝ってくれる人はいますか?

4

9 に答える 9

34

更新: 私の答えの最初の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)]

次に、それらをデータフレームとしてまとめることは簡単ですが、コードのその部分も必要な場合はお知らせください。


于 2015-01-15T15:11:05.010 に答える
6

名前は としてアクセスできる必要があるdimnames(coef(cv.glmnet.fit))[[1]]ため、次のように係数の名前と値の両方を data.frame に入れる必要があります。 data.frame(coef.name = dimnames(coef(GLMNET))[[1]], coef.value = matrix(coef(GLMNET)))

于 2015-02-19T21:10:50.897 に答える
6

ほうきのパッケージを確認してください。tidyさまざまな R オブジェクト ( を含むglmnet) の出力を data.framesに変換する機能があります。

于 2015-01-06T14:45:52.877 に答える
4

上記の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 対応のテーブルを生成します。

于 2015-12-27T13:18:26.480 に答える
2

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 から始まります。

于 2016-08-25T16:53:43.840 に答える
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)
}
于 2016-09-30T21:54:36.443 に答える
0

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))
)
于 2021-11-16T09:45:18.120 に答える