13

私はRの新しいユーザーで、SASから離れようとしています。Rで利用可能なすべてのパッケージとソースに少し不満を感じているため、ここでこの質問をしています。主にデータサイズが原因で、これを機能させることができないようです。

私は次のものを持っています:

200 個の予測機能と 1 つのクラス変数を含む、ローカル MySQL データベース内の SOURCE というテーブル。テーブルには 300 万件のレコードがあり、3 GB の大きさです。クラスごとのインスタンス数が等しくありません。

したい:

  1. SOURCE データベースをランダムにサンプリングして、クラスごとに同じ数のインスタンスを持つ、より小さなデータセットを作成します。
  2. サンプルをトレーニング セットとテスト セットに分割します。
  3. トレーニング セットで k-means クラスタリングを実行して、クラスごとに k 重心を決定します。
  4. 重心を持つテスト データの k-NN 分類をプリフォームします。
4

3 に答える 3

3

私が進める方法は次のとおりです。

1) テーブルの ID のリストを R に抽出します。これは、 RMySQLライブラリを使用した単純な SQL クエリで実行できます。

2) R で任意の方法で ID を分割し、 RMySQLを使用して後続の SQL クエリを再度実行します(この 2 ステップのアプローチは、MySQL で直接サンプリングするよりもはるかに高速であることがわかりました)。

3) サンプルの大きさによっては、ベースの R kmeans 実装を使用して回避できますが、これはより大きなサンプルでは失敗する可能性があります。その場合、ライブラリbiganalyticsの bigkmeans の使用を検討する必要があります。

于 2013-08-22T11:26:10.433 に答える
0

私は2つの質問のためにあなたを助けることができます。1-層化サンプリング2-分割トレーニングとテスト(つまり、キャリブレーション検証)

        n = c(2.23, 3.5, 12,2, 93, 57, 0.2,
 33, 5,2, 305, 5.3,2, 3.9, 4) 
     s = c("aa", "bb", "aa","aa", "bb", "cc","aa", "bb",
 "bb","aa", "aa","aa","aa","bb", "cc") 
         id = c(1, 2, 3,4, 5, 6,7, 8, 9,
10, 11, 12,13, 14, 15) 
         df = data.frame(id, n, s )       # df is a data frame

        source("http://news.mrdwab.com/stratified")
        sample<- stratified(df=df, 
                            id=1, #ID of your dataframe, 
                            #if there isn't you have to create it
                            group=3, #the position of your predictor features
                            size=2, #cardinality of selection
                            seed="NULL") 

        #then add a new column to your selection 
        sample["cal_val"]<- 1

        #now, you have a random selection of group 3, 
        #but you need to split it for cal and val, so:

        sample2<- stratified(df=sample, #use your previous selection
                             id=1, 
                             group=3, #sample on the same group used previously
                             size=1,#half of the previous selection
                             seed="NULL")

        sample2["val"]<- 1
        #merge the two selection
        merge<- merge(sample, sample2, all.x=T, by="id")
        merge[is.na(merge)] <- 0 #delete NA from merge
    #create a column where 1 is for calibration and 2 for validation    
    merge["calVal"]<- merge$cal_val.x + merge$cal_val.y 
#now "clean" you dataframe, because you have too many useless columns       
 id<- merge$id  
        n<- merge$n.x 
        s<- merge$s.x
        calval<- merge$calVal
        final_sample<- data.frame(id, n, s, calval)
于 2013-03-20T09:28:39.973 に答える
0

あなたの問題の多くは、キャレット パッケージを使用することで解決できると思います。クラス メンバーシップが等しいランダム サンプリングについては、指定したクラスごとに必要なサイズで 2 つのクエリを実行するだけで、それを SQL にプッシュします。他の人は、RMySql、RODBC、または RJDBC も同様に機能すると述べています。データをトレーニング セットとテスト セットに分離するには、次のキャレット関数を使用します。

# separate data into test and train sets, 70/30 split in this case

splitIndex <- createDataPartition(mydata$mytargetcolumn, p = 0.7, list = FALSE)
train <- mydata[splitIndex, ]
test <- mydata[-splitIndex, ]
testInd <- test[ ,!colnames(test) %in% "mytargetcolumn"]
testDep <- as.factor(test[, names(test) == "mytargetcolumn"]) 

次のように、キャレットを使用して KNN を実行することもできます。

modelKNN <- knn3(mytargetcolumn ~ ind1 + ind2, data = train, k = neighborCount, prob = TRUE)

そして、予測は簡単です:

# prediction using KNN to get class probabilities, change 'type' if you just want class prediction

predKNN <- predict(modelKNN, testInd, type = "prob")

キャレットを評価に使用することもできます。

# Generate confusion matrix from class predictions and actual values

confKNN <- confusionMatrix(testDep, predKNN)

個人的には、分類モデルの評価に AUC (pROC パッケージ経由) を使用していますが、これは精度よりも分類器の強度をより細かく測定できるためです。

于 2014-01-27T16:04:58.423 に答える