質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

解決済

1回答

802閲覧

【R】 交差検証のため分割したデータをデータ分析後、追加データを残したまま元の集約された状態のデータにしたい。

nasu0922

総合スコア17

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

0グッド

0クリップ

投稿2019/05/28 06:16

前提・実現したいこと

Rでデータ分析(ランダムフォレスト)を行なっており、その際にcreatefold関数でデータを10分割しています。
最終目的は、
・「Fold01の訓練用(90%)」でモデルを作って、「Fold01のテスト用(10%)」で目的変数の予測を付与(=predict関数)しモデル評価・・・を10回繰り返し行ない、predict関数で追加したデータは残したまま、10分割されたデータを元に戻してCSV出力したいと考えております。

■保存したいイメージ
№ 目的変数予測(テストデータにpredict関数で予測した値 ※0or1)
1   0
2   1
3   1
.   .
.   .
.   .

発生している問題・エラーメッセージ

上記を実行した結果下記のようにfold毎に結果が出ます。

$fold01
(№)
3 5 18 38 43 60 91 97 99 ...
(目的変数予測=0か1)
0 1 0 1 0 1 1 1  1...

$fold02
.
.
.

この結果をCSV出力しようとしましたが、下記エラーが発生します。

write.csv(results, "○○○.csv")

以下エラー
(function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, でエラー:
arguments imply differing number of rows: 118, 119, 117

R

1#ライブラリダウンロード 2library(randomForest) 3library(caret) 4library(modelr) 5library(dplyr) 6 7#データの読み込み 8dfj <- read.csv("任意のデータ.csv",header=T) 9 10#目的変数の属性をfactorに変更 11dfj$目的変数<-as.factor(dfj$P目的変数) 12 13#学習用とテスト用データに分ける 14set.seed(123) 15index <- createDataPartition(dfj$目的変数, p=.8, list=F) 16dfj.train <- dfj[index, ] 17dfj.test <- dfj[-index,] 18 19#データを10分割する 20set.seed(123) 21folds <- createFolds(dfj.train$目的変数,k=10) 22 23#ランダムフォレストを10分割分全て行ない、テストデータにpredictを付与する。 24results <- lapply(folds, function(x){ 25df_train <- dfj.train[-x,] 26df_test <- dfj.train[x,] 27df_model <- randomForest(目的変数 ~ ., data=df_train) 28df_pred <- predict(df_model,df_test) 29}) 30

試したこと

元々下記サイトを参考に進めていましたが、対応に苦慮しております。
http://rtokei.tech/machine-learning/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%80%9C%E3%83%A2%E3%83%87%E3%83%AB%E8%A9%95%E4%BE%A1%E6%B3%95%E3%80%9C/

また、交差検証で分割したデータを元に戻す、といったようなことはネット検索しても有力な手がかりがありませんでした。

何卒、よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

中の要素数がバラバラなlistをwrite.csvで直接ファイルに書き出すことは出来ません。

~~リストの中身を(桁数不揃いな)テキストファイルに書き出すとすれば、こんな感じになると思います。
~~

filename <- "test.csv" if(file.exists(filename)){ file.remove(filename) } sapply(names(results), function(x){ write.table( data.frame(t(results[[x]]),row.names = x), file = filename, append = T, sep = ",", col.names = F ) })

追記:
修正してみました。当方で適当に作ったリストではうまくいきましたが、どうでしょうか。

filename <- "test.csv" if(file.exists(filename)){ file.remove(filename) } sapply(names(results), function(x){ write( x = c(x, results[[x]]), file = filename, sep = ",", append = T, ncolumns = length(testlist[[x]])+1 ) } )

投稿2019/05/28 06:59

編集2019/05/28 20:52
KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nasu0922

2019/05/28 08:11

ご回答ありがとうございます。ちなみに、そのまま使わせていただくと下記エラーが発生してしまいました。 ------------------------------------------------------------- data.frame(t(results[[x]]), row.names = x) でエラー: 'row.names' は変数の一つを指定しなければなりません ------------------------------------------------------------- 'row.names' (行名)は変数を指定しなければいけないとのエラーですが、どのように対処すればよろしいのでしょうか。また、可能であれば下記データとして出力することは可能でしょうか。 № (予測) 1  0 2  0 3  1 ・  ・ ・  ・ 99  ・ 重ねてのご質問で申し訳ありません。ご回答いただけるようであればよろしくお願いいたします。
KojiDoi

2019/05/28 08:48

str(results)の結果を見せてください。
nasu0922

2019/05/28 08:58

結果は以下の通りです。お手数をお掛けしますがよろしくお願いいたします。 > str(results) List of 10 $ Fold01: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 2 1 ... ..- attr(*, "names")= chr [1:118] "3" "5" "18" "38" ... $ Fold02: Factor w/ 2 levels "0","1": 2 2 2 2 1 2 2 2 1 2 ... ..- attr(*, "names")= chr [1:118] "8" "33" "44" "51" ... $ Fold03: Factor w/ 2 levels "0","1": 1 2 1 1 1 1 2 2 1 1 ... ..- attr(*, "names")= chr [1:119] "11" "12" "24" "25" ... $ Fold04: Factor w/ 2 levels "0","1": 1 1 1 1 2 1 1 1 1 1 ... ..- attr(*, "names")= chr [1:118] "14" "16" "34" "35" ... $ Fold05: Factor w/ 2 levels "0","1": 1 1 1 2 1 1 1 1 1 1 ... ..- attr(*, "names")= chr [1:117] "15" "29" "39" "40" ... $ Fold06: Factor w/ 2 levels "0","1": 1 2 1 1 2 2 1 1 2 1 ... ..- attr(*, "names")= chr [1:118] "4" "41" "47" "55" ... $ Fold07: Factor w/ 2 levels "0","1": 1 1 1 1 1 2 2 1 2 1 ... ..- attr(*, "names")= chr [1:119] "9" "10" "31" "32" ... $ Fold08: Factor w/ 2 levels "0","1": 2 1 1 1 1 1 2 1 1 2 ... ..- attr(*, "names")= chr [1:118] "13" "17" "20" "42" ... $ Fold09: Factor w/ 2 levels "0","1": 2 1 1 2 2 2 2 1 2 1 ... ..- attr(*, "names")= chr [1:117] "1" "2" "21" "57" ... $ Fold10: Factor w/ 2 levels "0","1": 1 1 1 1 2 2 1 1 2 1 ... ..- attr(*, "names")= chr [1:118] "23" "27" "30" "75" ...
nasu0922

2019/05/28 23:41

再回答ありがとうございます。「results」のデータはCSVで抽出できました。 最終的にはfold毎にある元々の№を付与して下記データとしたいですが、書き出しの基礎が分からないため、対応方法を教えていただけませんでしょうか。頼りきりで大変申し訳ありません。 →№=(attr(*,"names")=chr[1:11○]"3" "5" "8"・・・を追加し、下記データとしたい。 Fold01 № (results) 3  1 5  1 18  1 ・  ・
KojiDoi

2019/05/29 15:27

最初の質問と随分内容が食い違っているようですが、そういうことなら lapply(names(results), function(x){data.frame(fold=x, n=attr(results[[x]],"name"), v=results[[x]])}) みたいにしてデータフレームを作ってしまえばいいのでは。
nasu0922

2019/05/29 23:46

意図が変わってしまい申し訳ございませんでした。 上記実行しましたところ、問題なく結果が出ました。 データ分析は少し理解できたのですが、データの加工や出力といった部分がまだまだ初心者ですので、今回教えていただいた内容をひとつひとつ確認いたします。 何度もご回答いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問