3

関数を使用して、テストとトレーニングに分割された同じデータセットでデータセットから派生した教師なし主成分prcompを使用するにはどうすればよいですか?

train <- sample(1:nrow(auto), 60000)
x <- as.matrix(auto[,-1])  ##Covariates
y <- auto[,1]                   ##Response
pc <- prcomp(x)             ##Find Principal Components

data <- data.frame(y=y, (x %*% pc$rotation[,1:9]))
fit <- glm(y ~ ., data=data[train,], family="binomial")   ##Train It

prediction <- predict(fit, newdata=data) > 0  ##Prediction on Entire Data Set

error <- mean(y[-train]] != prediction[-train])  ##Mean out of Sample error
4

2 に答える 2

7

これは再現可能な例です:

set.seed(1)
want <- sample(50, 40)
Iris <- iris[c(51:100, 101:150), ] ## only keep versicolor and virginica
## take our training and test sets
train <- droplevels(Iris[c((1:50)[want], (51:100)[want]), , drop = FALSE])
test <- droplevels(Iris[c((1:50)[-want], (51:100)[-want]), , drop = FALSE])

## fit the PCA
pc <- prcomp(train[, 1:4])

pc$xが回転したデータであることに注意してください。使用しましたがX %*% pc$rotation(Xトレーニング データ マトリックスはどこにありますか)、最初にデータを中央に配置しませんでしたが、それらは同等です。回帰の予測子を中央に配置すると役立つ場合があります。

## create data frame for logistic regression
mydata <- data.frame(Species = train[, "Species"], pc$x)
## ...and fit the model
mod <- glm(Species ~ PC1, data = mydata, family = binomial)

テスト セット データの PC1 のスコアを予測します。つまり、トレーニング データの PC を形成するために使用したのと同じ回転を使用して、テスト セットを回転させます。そのためにpredict()、クラスのメソッドを使用できます"prcomp"

test.p <- predict(pc, newdata = test[, 1:4])

これを使用してクラスを予測します

pred <- predict(mod, newdata = data.frame(test.p), type = "response")
pred

> pred
         56          66          67          71          72 
0.080427399 0.393133104 0.092661480 0.395813527 0.048277608 
         74          76          82          87          95 
0.226191156 0.333553423 0.003860679 0.617977807 0.029469167 
        106         116         117         121         122 
0.999648054 0.922145431 0.924464339 0.989271655 0.318477762 
        124         126         132         137         145 
0.581235903 0.995224501 0.999770995 0.964825109 0.988121496 
> 1 - pred
          56           66           67           71           72 
0.9195726006 0.6068668957 0.9073385196 0.6041864731 0.9517223918 
          74           76           82           87           95 
0.7738088439 0.6664465767 0.9961393215 0.3820221934 0.9705308332 
         106          116          117          121          122 
0.0003519463 0.0778545688 0.0755356606 0.0107283449 0.6815222382 
         124          126          132          137          145 
0.4187640970 0.0047754987 0.0002290047 0.0351748912 0.0118785036

predテスト観測がIris virginicaである確率が含まれます。glm()応答が (この例のように) 因子である場合、その因子の最初のレベル (ここでversicolorは ) は失敗または0と見なされ、2 番目以降のレベルは成功または を示すことに注意してください1。この例ではクラスが 2 つしかないため、モデルは次のようにパラメータ化されますversicolor1 - predの予測確率が得られvirginicaます。

私はあなたが質問に含めたエラー計算に従わないので、解決するのはあなた次第です. ただし、モデルの成功の相互分類表は、次の方法で生成できます。

> predSpecies <- factor(ifelse(pred >= 0.5, "virginica", "versicolor"))
> table(test$Species, predSpecies)
            predSpecies
             versicolor virginica
  versicolor          9         1
  virginica           1         9

モデルが 2 つのテスト セットの観測値に誤りがあることを示しています。

于 2012-06-04T12:46:30.420 に答える
2

最初のステップとして、データをトレーニングとテストに分割する必要があります。そうしないと、PC スコアが独立しているとは言えません。

つまり、PCA 回転は x [train,] のみから計算されます!

次に、同じ回転が x [test,] に適用されます。

@Joranが言うように、他のすべてについては、再現可能なコードが必要です。

于 2012-06-04T10:47:44.247 に答える