র্যান্ডমফোরস্ট এবং ক্লাস ওজন


11

এক বাক্যে প্রশ্ন: কেউ কি এলোমেলো বনের জন্য ভাল বর্গ ওজন নির্ধারণ করতে জানেন?

ব্যাখ্যা: আমি ভারসাম্যহীন ডেটাসেট নিয়ে ঘুরে বেড়াচ্ছি। আমি খুব কম ইতিবাচক উদাহরণ এবং অনেক নেতিবাচক উদাহরণ সহ খুব স্কিউড ডেটাসেটে কোনও মডেলকে প্রশিক্ষণের জন্য Rপ্যাকেজটি ব্যবহার করতে চাই randomForest। আমি জানি, অন্যান্য পদ্ধতি আছে এবং শেষ পর্যন্ত আমি সেগুলি ব্যবহার করব তবে প্রযুক্তিগত কারণে, এলোমেলো বন নির্মাণ একটি মধ্যবর্তী পদক্ষেপ। তাই আমি প্যারামিটারটি নিয়ে চারপাশে খেললাম classwt। আমি ব্যাসার্ধ 2 দিয়ে ডিস্কে 5000 টি নেতিবাচক উদাহরণগুলির একটি খুব কৃত্রিম ডেটাসেট স্থাপন করছি এবং তারপরে আমি ব্যাসার্ধ 1 সহ ডিস্কে 100 ধনাত্মক উদাহরণগুলি নমুনা করছি I

1) শ্রেণি ওজন ছাড়াই মডেল 'অবক্ষয়' হয়ে যায়, অর্থাৎ FALSEসর্বত্র ভবিষ্যদ্বাণী করে ।

2) ন্যায্য শ্রেণীর ওজন সহ আমি মাঝখানে একটি 'সবুজ বিন্দু' দেখতে পাব, অর্থাৎ এটি ব্যাসার্ধ 1 দিয়ে ডিস্কটি পূর্বাভাস দেবে TRUEযদিও নেতিবাচক উদাহরণ রয়েছে।

ডেটা দেখতে কেমন লাগে:

এখানে চিত্র বর্ণনা লিখুন

ওজন না করেই এটি ঘটে: (কলটি হ'ল randomForest(x = train[, .(x,y)],y = as.factor(train$z),ntree = 50):)

এখানে চিত্র বর্ণনা লিখুন

চেক করার জন্য আমি নেতিবাচক শ্রেণিকে ডাউনস্যাম্পলিং করে যখন ডেটাসেটকে সহিংসভাবে ভারসাম্য বজায় রাখি তখন কী ঘটে যায় তা চেষ্টা করে দেখেছি যাতে সম্পর্কটি আবার 1: 1 হয়। এটি আমাকে প্রত্যাশিত ফলাফল দেয়:

এখানে চিত্র বর্ণনা লিখুন

যাইহোক, আমি যখন 'ফলস' = 1, 'সত্য' = 50 (একটি ধনাত্মক চেয়ে 50 গুণ বেশি নেতিবাচক থাকায় এটি ন্যায্য ওজনযুক্ত) এর সাথে একটি মডেলটি গণনা করি তখন আমি এটি পাই:

এখানে চিত্র বর্ণনা লিখুন

আমি যখন 'FALSE' = 0.05 এবং 'TRU' = 500000 এর মতো কিছু অদ্ভুত মানকে ওজন সেট করি তখনই আমি বুদ্ধিমান ফলাফল পাই:

এখানে চিত্র বর্ণনা লিখুন

এবং এটি বেশ অস্থির, অর্থাত্ 'FALSE' ওজন 0.01 এ পরিবর্তন করা মডেলটিকে আবার হ্রাস করতে বাধ্য করে (যেমন এটি TRUEসর্বত্র পূর্বাভাস দেয় )।

প্রশ্ন: কেউ কি এলোমেলো বনের জন্য ভাল বর্গ ওজন নির্ধারণ করতে জানেন?

আর কোড:

library(plot3D)
library(data.table)
library(randomForest)
set.seed(1234)
amountPos = 100
amountNeg = 5000

# positives
r = runif(amountPos, 0, 1)
phi = runif(amountPos, 0, 2*pi)
x = r*cos(phi)
y = r*sin(phi)
z = rep(T, length(x))
pos = data.table(x = x, y = y, z = z)

# negatives
r = runif(amountNeg, 0, 2)
phi = runif(amountNeg, 0, 2*pi)
x = r*cos(phi)
y = r*sin(phi)
z = rep(F, length(x))
neg = data.table(x = x, y = y, z = z)

train = rbind(pos, neg)

# draw train set, verify that everything looks ok
plot(train[z == F]$x, train[z == F]$y, col="red")
points(train[z == T]$x, train[z == T]$y, col="green")
# looks ok to me :-)

Color.interpolateColor = function(fromColor, toColor, amountColors = 50) {
  from_rgb = col2rgb(fromColor)
  to_rgb = col2rgb(toColor)

  from_r = from_rgb[1,1]
  from_g = from_rgb[2,1]
  from_b = from_rgb[3,1]

  to_r = to_rgb[1,1]
  to_g = to_rgb[2,1]
  to_b = to_rgb[3,1]

  r = seq(from_r, to_r, length.out = amountColors)
  g = seq(from_g, to_g, length.out = amountColors)
  b = seq(from_b, to_b, length.out = amountColors)

  return(rgb(r, g, b, maxColorValue = 255))
}
DataTable.crossJoin = function(X,Y) {
  stopifnot(is.data.table(X),is.data.table(Y))
  k = NULL
  X = X[, c(k=1, .SD)]
  setkey(X, k)
  Y = Y[, c(k=1, .SD)]
  setkey(Y, k)
  res = Y[X, allow.cartesian=TRUE][, k := NULL]
  X = X[, k := NULL]
  Y = Y[, k := NULL]
  return(res)
}

drawPredictionAreaSimple = function(model) {
  widthOfSquares = 0.1
  from = -2
  to = 2

  xTable = data.table(x = seq(from=from+widthOfSquares/2,to=to-widthOfSquares/2,by = widthOfSquares))
  yTable = data.table(y = seq(from=from+widthOfSquares/2,to=to-widthOfSquares/2,by = widthOfSquares))
  predictionTable = DataTable.crossJoin(xTable, yTable)
  pred = predict(model, predictionTable)
  res = rep(NA, length(pred))
  res[pred == "FALSE"] = 0
  res[pred == "TRUE"] = 1
  pred = res
  predictionTable = predictionTable[, PREDICTION := pred]
  #predictionTable = predictionTable[y == -1 & x == -1, PREDICTION := 0.99]
  col = Color.interpolateColor("red", "green")

  input = matrix(c(predictionTable$x, predictionTable$y), nrow = 2, byrow = T)
  m = daply(predictionTable, .(x, y), function(x) x$PREDICTION)
  image2D(z = m, x = sort(unique(predictionTable$x)), y = sort(unique(predictionTable$y)), col = col, zlim = c(0,1))
}


rfModel = randomForest(x = train[, .(x,y)],y = as.factor(train$z),ntree = 50)
rfModelBalanced = randomForest(x = train[, .(x,y)],y = as.factor(train$z),ntree = 50, classwt = c("FALSE" = 1, "TRUE" = 50))
rfModelBalancedWeird = randomForest(x = train[, .(x,y)],y = as.factor(train$z),ntree = 50, classwt = c("FALSE" = 0.05, "TRUE" = 500000))


drawPredictionAreaSimple(rfModel)
title("unbalanced")
drawPredictionAreaSimple(rfModelBalanced)
title("balanced with weights")
pos = train[z == T]
neg = train[z == F]
neg = neg[sample.int(neg[, .N], size = 100, replace = FALSE)]
trainSampled = rbind(pos, neg)
rfModelBalancedSampling = randomForest(x = trainSampled[, .(x,y)],y = as.factor(trainSampled$z),ntree = 50)
drawPredictionAreaSimple(rfModelBalancedSampling)
title("balanced with sampling")


drawPredictionAreaSimple(rfModelBalancedWeird)
title("balanced with weird weights")

যদি স্যাম্পসাইজ কাজ করে তবে তা কেন ব্যবহার করবেন না? আমি অন্যদের মতো স্যাম্পসাইজও এর সমাধান করতে আরও ভাল কাজ করে দেখলাম। এছাড়াও এখানে একটি মহান উত্তর দেখার stats.stackexchange.com/questions/157714/...
সেক্স

ডিপ্লি প্লাইয়ারে রয়েছে, আপনার এটি কল করা উচিত।
EngrStudent

ক্লাসের প্রাইভেট ক্লাসগুলি। এক যোগ করতে হবে না। প্রতিরোধের জন্য উপেক্ষিত।
দিয়েগো

@ ডিগো: এই প্যারামিটারটি খুব সমস্যাযুক্ত বলে মনে হচ্ছে, এই প্যারামিটারটি কী আচরণ করে তা আমি বুঝতে পারি না (প্রশ্নে মন্তব্যগুলি দেখুন!) ...
ফ্যাবিয়ান ওয়ার্নার

উত্তর:


2

একটি কঠিন সদস্যপদ শ্রেণিবদ্ধ করতে একটি হার্ড কাট অফ ব্যবহার করবেন না, এবং এমন কঠোর সদস্যতার পূর্বাভাসের উপর নির্ভরশীল কেপিআই ব্যবহার করবেন না। পরিবর্তে, predict(..., type="prob")যথাযথ ব্যবহার করে এগুলি ব্যবহার করে একটি সম্ভাব্য ভবিষ্যদ্বাণী নিয়ে কাজ করুন ।

এই পূর্বের থ্রেডটি সহায়ক হওয়া উচিত: শ্রেণিবদ্ধকরণের মডেলগুলি মূল্যায়নের জন্য নির্ভুলতা কেন সেরা মাপকাঠি নয়? Unsurprisingly যথেষ্ট, আমি বিশ্বাস করি আমার উত্তর বিশেষ করে সহায়ক হবে (নির্লজ্জতা জন্য দুঃখিত), কারণ যে would খনি আগের উত্তর


1
আপনি আজ এই বিষয়টির বিষয়ে কথা বলেছেন, তাই না? আমি আমার কাজের জন্য এটি সন্ধান করব :-)
জোনাস হাইডেলবার্গ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.