এক্সজিবিস্ট নিজে থেকেই বহুবিধ লাইন পরিচালনা করে?


23

আমি বর্তমানে 21 টি বৈশিষ্ট্য (প্রায় 150 টি বৈশিষ্ট্যের তালিকা থেকে নির্বাচিত) সহ ডেটা-সেটে এক্সজিবিস্ট ব্যবহার করছি, তারপরে এক-হট তাদের কোডড করে ~ 98 বৈশিষ্ট্যগুলি প্রাপ্ত করতে। এই 98 বৈশিষ্ট্য কয়েক উদাহরণস্বরূপ, কিছুটা অপ্রয়োজনীয় আছেন: একটি পরিবর্তনশীল (বৈশিষ্ট) এছাড়াও হিসাবে প্রদর্শিত হবে এবং ।একজনবিএকজনসিএকজন

আমার প্রশ্নগুলি হ'ল:

  • কীভাবে ( যদি? ) বুস্টেড ডিসিশন ট্রিগুলি বহুবিধ লাইন পরিচালনা করে?
  • যদি বহুবিবাহের অস্তিত্ব ভবিষ্যদ্বাণীটি পরিচালনা না করে তবে কীভাবে প্রভাব ফেলবে?

আমি যা বুঝতে পারি তা থেকে, মডেল একাধিক গাছ শিখছে এবং চূড়ান্ত ভবিষ্যদ্বাণীটি ব্যক্তি পূর্বাভাসের "ওজনযুক্ত যোগফল" এর মতো কোনও কিছুর উপর ভিত্তি করে। সুতরাং এটি যদি সঠিক হয় তবে বুস্টেড ডিসিশন ট্রিগুলি ভেরিয়েবলের মধ্যে সহ-নির্ভরতা পরিচালনা করতে সক্ষম হওয়া উচিত

এছাড়াও, সম্পর্কিত নোটে - এক্সজিবিস্টে পরিবর্তনশীল গুরুত্বটি কীভাবে কাজ করে?


আমি বুঝতে পারি গাছগুলি বহুবিধ লাইন পরিচালনা করতে পারে। তবে রিগ্রেশন-ভিত্তিক এক্সজিবিস্ট সম্পর্কে কী? এটি পাশাপাশি বহু-সহ্য পরিচালনা করতে পারে? > সিদ্ধান্তের গাছগুলি স্বভাবতই বহু-প্রান্তিকের প্রতিরোধী। উদাহরণস্বরূপ, যদি আপনার 2 টি বৈশিষ্ট্য থাকে যা 99% এর সাথে সম্পর্কিত, যখন> বিভাজনের সিদ্ধান্ত নেওয়ার পরে গাছ তাদের মধ্যে একটি বেছে নেবে। অন্যান্য> মডেল যেমন লজিস্টিক রিগ্রেশন উভয় বৈশিষ্ট্য ব্যবহার করবে। >> যেহেতু উত্সাহিত গাছগুলি পৃথক সিদ্ধান্ত গাছ ব্যবহার করে, সেগুলিও> বহু-তাত্পর্য দ্বারা প্রভাবিত হয় না। যাইহোক, তার একটি ভাল অনুশীলন> Tra জন্য ব্যবহৃত কোনো ডেটা সেটটি থেকে কোন অপ্রয়োজনীয় বৈশিষ্ট্যগুলি সরান
জে সাক্সেনা

উত্তর:


27

সিদ্ধান্ত গাছ প্রকৃতির দ্বারা বহু-প্রান্তিকের প্রতিরোধী to উদাহরণস্বরূপ, যদি আপনার 2 টি বৈশিষ্ট্য থাকে যা 99% এর সাথে সম্পর্কিত, বিভাজনের সিদ্ধান্ত নেওয়ার সময় গাছ তাদের মধ্যে একটি বেছে নেবে। অন্যান্য মডেল যেমন লজিস্টিক রিগ্রেশন উভয় বৈশিষ্ট্য ব্যবহার করবে।

যেহেতু উত্সাহিত গাছগুলি পৃথক সিদ্ধান্ত গাছ ব্যবহার করে, সেগুলিও বহু-প্রান্তিকের দ্বারা প্রভাবিত হয় না। যাইহোক, মডেলটির অ্যালগরিদম নির্বিশেষে প্রশিক্ষণের জন্য ব্যবহৃত কোনও ডেটাসেট থেকে যে কোনও রিন্ডান্ট বৈশিষ্ট্যগুলি সরিয়ে ফেলা ভাল অভ্যাস। আপনার ক্ষেত্রে যেহেতু আপনি নতুন বৈশিষ্ট্যগুলি অর্জন করছেন, আপনি এই পদ্ধতির ব্যবহার করতে পারবেন, প্রতিটি বৈশিষ্ট্যের গুরুত্ব মূল্যায়ন করতে এবং আপনার চূড়ান্ত মডেলের জন্য কেবল সেরা বৈশিষ্ট্যগুলি ধরে রাখতে পারেন।

একটি এক্সজিবিউস্ট মডেলের গুরুত্ব ম্যাট্রিক্স আসলে একটি বর্ধিত গাছগুলিতে ব্যবহৃত সমস্ত বৈশিষ্ট্যের নাম তালিকাভুক্ত প্রথম কলাম সহ একটি ডেটা.ট্যাবল অবজেক্ট। দ্বিতীয় কলামটি গেইন মেট্রিক যা মডেলের প্রতিটি গাছের জন্য প্রতিটি বৈশিষ্ট্যের অবদান গ্রহণ করে গণনা করা মডেলের সাথে সম্পর্কিত বৈশিষ্ট্যের আপেক্ষিক অবদান বোঝায়। অন্য বৈশিষ্ট্যের তুলনায় এই মেট্রিকের একটি উচ্চতর মান বোঝায় যে ভবিষ্যদ্বাণী উত্পন্ন করার জন্য এটি আরও গুরুত্বপূর্ণ।


7

আমি এই সম্পর্কে কৌতূহল ছিল এবং কয়েকটি পরীক্ষা করেছিলাম।

আমি হীরা ডেটাসেটের উপর একটি মডেলকে প্রশিক্ষণ দিয়েছি এবং দেখেছি যে হীরাটির দাম একটি নির্দিষ্ট প্রান্তিকের চেয়ে বেশি কিনা তা পূর্বাভাস দেওয়ার জন্য ভেরিয়েবল "এক্স" সবচেয়ে গুরুত্বপূর্ণ। তারপরে, আমি একাধিক কলাম যুক্ত করেছি x এর সাথে অত্যন্ত সংযুক্ত, একই মডেলটি চালিয়েছি এবং একই মানগুলি পর্যবেক্ষণ করেছি।

দেখে মনে হচ্ছে যখন দুটি কলামের মধ্যে পারস্পরিক সম্পর্ক 1 হয়, এক্সজিবুস্ট মডেল গণনা করার আগে অতিরিক্ত কলামটি সরিয়ে দেয়, তাই গুরুত্ব প্রভাবিত হয় না। যাইহোক, আপনি যখন একটি কলাম যুক্ত করেন যা আংশিকভাবে অন্যের সাথে সম্পর্কিত হয়, এইভাবে নিম্ন সহগের সাথে, মূল পরিবর্তনশীল এক্সটির গুরুত্ব হ্রাস করা হয়।

উদাহরণস্বরূপ যদি আমি একটি পরিবর্তনশীল xy = x + y যুক্ত করি, তবে x এবং y উভয়েরই গুরুত্ব হ্রাস পায়। একইভাবে, আমি যদি r = 0.4, 0.5 বা 0.6 দিয়ে নতুন ভেরিয়েবল যুক্ত করি তবে x এর গুরুত্ব হ্রাস পায়, যদিও কিছুটা হলেও।

আমি মনে করি যে আপনি যখন মডেলের যথার্থতা গণনা করেন তখন কোলাইনারিটি বাড়াতে সমস্যা হয় না, কারণ সিদ্ধান্তের গাছটি কোনটি ভেরিয়েবল ব্যবহার করা হয় তা বিবেচনা করে না। তবে এটি ভেরিয়েবলের গুরুত্বকে প্রভাবিত করতে পারে, কারণ দুটি পারস্পরিক সম্পর্কযুক্ত ভেরিয়েবলের মধ্যে একটি অপসারণ করা মডেলের যথার্থতার উপর খুব বেশি প্রভাব ফেলবে না, অন্যটির অনুরূপ তথ্য রয়েছে তা প্রদত্ত।

library(tidyverse)
library(xgboost)

evaluate_model = function(dataset) {
    print("Correlation matrix")
    dataset %>% select(-cut, -color, -clarity, -price) %>% cor %>% print

    print("running model")
    diamond.model = xgboost(
        data=dataset %>% select(-cut, -color, -clarity, -price) %>% as.matrix, 
        label=dataset$price > 400, 
        max.depth=15, nrounds=30, nthread=2, objective = "binary:logistic",
        verbose=F
        )

    print("Importance matrix")
    importance_matrix <- xgb.importance(model = diamond.model)
    importance_matrix %>% print
    xgb.plot.importance(importance_matrix)
    }

> diamonds %>% head
carat   cut color   clarity depth   table   price   x   y   z
0.23    Ideal   E   SI2 61.5    55  326 3.95    3.98    2.43
0.21    Premium E   SI1 59.8    61  326 3.89    3.84    2.31
0.23    Good    E   VS1 56.9    65  327 4.05    4.07    2.31
0.29    Premium I   VS2 62.4    58  334 4.20    4.23    2.63
0.31    Good    J   SI2 63.3    58  335 4.34    4.35    2.75
0.24    Very Good   J   VVS2    62.8    57  336 3.94    3.96    2.48

হীরার ডেটাতে একটি মডেল মূল্যায়ন করুন

সমস্ত সংখ্যক ভেরিয়েবল উপলব্ধ (ক্যারেট, গভীরতা, টেবিল, এক্স, ওয়াই, এক্স) সরবরাহ করে দাম 400 এর বেশি কিনা তা আমরা পূর্বাভাস দিই

নোট করুন যে এক্সটি সর্বাধিক গুরুত্বপূর্ণ পরিবর্তনশীল, এর গুরুত্ব অর্জনের স্কোর 0.375954।

evaluate_model(diamonds)
    [1] "Correlation matrix"
               carat       depth      table           x           y          z
    carat 1.00000000  0.02822431  0.1816175  0.97509423  0.95172220 0.95338738
    depth 0.02822431  1.00000000 -0.2957785 -0.02528925 -0.02934067 0.09492388
    table 0.18161755 -0.29577852  1.0000000  0.19534428  0.18376015 0.15092869
    x     0.97509423 -0.02528925  0.1953443  1.00000000  0.97470148 0.97077180
    y     0.95172220 -0.02934067  0.1837601  0.97470148  1.00000000 0.95200572
    z     0.95338738  0.09492388  0.1509287  0.97077180  0.95200572 1.00000000
    [1] "running model"
    [1] "Importance matrix"
       Feature       Gain      Cover  Frequency
    1:       x 0.37595419 0.54788335 0.19607102
    2:   carat 0.19699839 0.18015576 0.04873442
    3:   depth 0.15358261 0.08780079 0.27767284
    4:       y 0.11645929 0.06527969 0.18813751
    5:   table 0.09447853 0.05037063 0.17151492
    6:       z 0.06252699 0.06850978 0.11786929

R = 1 থেকে x এর সাথে একটি ভেরিয়েবল যুক্ত হীরাতে প্রশিক্ষিত মডেল

এখানে আমরা একটি নতুন কলাম যুক্ত করব, যা কোনও নতুন তথ্য যুক্ত করে না, কারণ এটি পুরোপুরি x এর সাথে সম্পর্কিত।

নোট করুন যে এই নতুন ভেরিয়েবলটি আউটপুটে উপস্থিত নেই। দেখে মনে হচ্ছে xgboost গণনা শুরু করার আগে স্বয়ংক্রিয়ভাবে পুরোপুরি সংযুক্ত ভেরিয়েবলগুলি সরিয়ে দেয়। এক্স এর গুরুত্ব লাভ একই, 0.3759।

diamonds_xx = diamonds %>%
    mutate(xx = x + runif(1, -1, 1))
evaluate_model(diamonds_xx)
[1] "Correlation matrix"
           carat       depth      table           x           y          z
carat 1.00000000  0.02822431  0.1816175  0.97509423  0.95172220 0.95338738
depth 0.02822431  1.00000000 -0.2957785 -0.02528925 -0.02934067 0.09492388
table 0.18161755 -0.29577852  1.0000000  0.19534428  0.18376015 0.15092869
x     0.97509423 -0.02528925  0.1953443  1.00000000  0.97470148 0.97077180
y     0.95172220 -0.02934067  0.1837601  0.97470148  1.00000000 0.95200572
z     0.95338738  0.09492388  0.1509287  0.97077180  0.95200572 1.00000000
xx    0.97509423 -0.02528925  0.1953443  1.00000000  0.97470148 0.97077180
               xx
carat  0.97509423
depth -0.02528925
table  0.19534428
x      1.00000000
y      0.97470148
z      0.97077180
xx     1.00000000
[1] "running model"
[1] "Importance matrix"
   Feature       Gain      Cover  Frequency
1:       x 0.37595419 0.54788335 0.19607102
2:   carat 0.19699839 0.18015576 0.04873442
3:   depth 0.15358261 0.08780079 0.27767284
4:       y 0.11645929 0.06527969 0.18813751
5:   table 0.09447853 0.05037063 0.17151492
6:       z 0.06252699 0.06850978 0.11786929

X + y এর জন্য একটি কলাম যুক্ত করে হিরেগুলিতে প্রশিক্ষিত মডেল

আমরা একটি নতুন কলাম xy = x + y যুক্ত করব। এটি আংশিকভাবে উভয় x এবং y এর সাথে সম্পর্কিত।

নোট করুন যে x এবং y এর গুরুত্ব খানিকটা হ্রাস পেয়েছে, x এর জন্য 0.3759 থেকে 0.3592 থেকে এবং y এর জন্য 0.116 থেকে 0.079 এ চলেছে।

diamonds_xy = diamonds %>%
    mutate(xy=x+y)
evaluate_model(diamonds_xy)

[1] "Correlation matrix"
           carat       depth      table           x           y          z
carat 1.00000000  0.02822431  0.1816175  0.97509423  0.95172220 0.95338738
depth 0.02822431  1.00000000 -0.2957785 -0.02528925 -0.02934067 0.09492388
table 0.18161755 -0.29577852  1.0000000  0.19534428  0.18376015 0.15092869
x     0.97509423 -0.02528925  0.1953443  1.00000000  0.97470148 0.97077180
y     0.95172220 -0.02934067  0.1837601  0.97470148  1.00000000 0.95200572
z     0.95338738  0.09492388  0.1509287  0.97077180  0.95200572 1.00000000
xy    0.96945349 -0.02750770  0.1907100  0.99354016  0.99376929 0.96744200
              xy
carat  0.9694535
depth -0.0275077
table  0.1907100
x      0.9935402
y      0.9937693
z      0.9674420
xy     1.0000000
[1] "running model"
[1] "Importance matrix"
   Feature       Gain      Cover  Frequency
1:       x 0.35927767 0.52924339 0.15952849
2:   carat 0.17881931 0.18472506 0.04793713
3:   depth 0.14353540 0.07482622 0.24990177
4:   table 0.09202059 0.04714548 0.16267191
5:      xy 0.08203819 0.04706267 0.13555992
6:       y 0.07956856 0.05284980 0.13595285
7:       z 0.06474029 0.06414738 0.10844794

হীরা ডেটা সম্পর্কে প্রশিক্ষিত মডেল, রিডানড্যান্ট কলামগুলি সংশোধন করে

আমরা তিনটি নতুন কলাম যুক্ত করব যা এক্স (আর = 0.4, 0.5 এবং 0.6) এর সাথে সম্পর্কিত এবং কী ঘটে তা দেখুন।

নোট করুন যে এক্সটির গুরুত্ব 0.3759 থেকে 0.279 এ নেমে এসে কমে যায়।

#' given a vector of values (e.g. diamonds$x), calculate three new vectors correlated to it
#' 
#' Source: https://stat.ethz.ch/pipermail/r-help/2007-April/128938.html
calculate_correlated_vars = function(x1) {

    # create the initial x variable
    #x1 <- diamonds$x

    # x2, x3, and x4 in a matrix, these will be modified to meet the criteria
    x234 <- scale(matrix( rnorm(nrow(diamonds) * 3), ncol=3 ))

    # put all into 1 matrix for simplicity
    x1234 <- cbind(scale(x1),x234)

    # find the current correlation matrix
    c1 <- var(x1234)

    # cholesky decomposition to get independence
    chol1 <- solve(chol(c1))

    newx <-  x1234 %*% chol1 

    # check that we have independence and x1 unchanged
    zapsmall(cor(newx))
    all.equal( x1234[,1], newx[,1] )

    # create new correlation structure (zeros can be replaced with other r vals)
    newc <- matrix( 
    c(1  , 0.4, 0.5, 0.6, 
      0.4, 1  , 0  , 0  ,
      0.5, 0  , 1  , 0  ,
      0.6, 0  , 0  , 1  ), ncol=4 )

    # check that it is positive definite
    eigen(newc)

    chol2 <- chol(newc)

    finalx <- newx %*% chol2 * sd(x1) + mean(x1)

    # verify success
    mean(x1)
    colMeans(finalx)

    sd(x1)
    apply(finalx, 2, sd)

    zapsmall(cor(finalx))
    #pairs(finalx)

    all.equal(x1, finalx[,1])
    finalx
}
finalx = calculate_correlated_vars(diamonds$x)
diamonds_cor = diamonds
diamonds_cor$x5 = finalx[,2]
diamonds_cor$x6 = finalx[,3]
diamonds_cor$x7 = finalx[,4]
evaluate_model(diamonds_cor)
[1] "Correlation matrix"
           carat        depth       table           x           y          z
carat 1.00000000  0.028224314  0.18161755  0.97509423  0.95172220 0.95338738
depth 0.02822431  1.000000000 -0.29577852 -0.02528925 -0.02934067 0.09492388
table 0.18161755 -0.295778522  1.00000000  0.19534428  0.18376015 0.15092869
x     0.97509423 -0.025289247  0.19534428  1.00000000  0.97470148 0.97077180
y     0.95172220 -0.029340671  0.18376015  0.97470148  1.00000000 0.95200572
z     0.95338738  0.094923882  0.15092869  0.97077180  0.95200572 1.00000000
x5    0.39031255 -0.007507604  0.07338484  0.40000000  0.38959178 0.38734145
x6    0.48879000 -0.016481580  0.09931705  0.50000000  0.48835896 0.48487442
x7    0.58412252 -0.013772440  0.11822089  0.60000000  0.58408881 0.58297414
                 x5            x6            x7
carat  3.903125e-01  4.887900e-01  5.841225e-01
depth -7.507604e-03 -1.648158e-02 -1.377244e-02
table  7.338484e-02  9.931705e-02  1.182209e-01
x      4.000000e-01  5.000000e-01  6.000000e-01
y      3.895918e-01  4.883590e-01  5.840888e-01
z      3.873415e-01  4.848744e-01  5.829741e-01
x5     1.000000e+00  5.925447e-17  8.529781e-17
x6     5.925447e-17  1.000000e+00  6.683397e-17
x7     8.529781e-17  6.683397e-17  1.000000e+00
[1] "running model"
[1] "Importance matrix"
   Feature       Gain      Cover  Frequency
1:       x 0.27947762 0.51343709 0.09748172
2:   carat 0.13556427 0.17401365 0.02680747
3:      x5 0.13369515 0.05267688 0.18155971
4:      x6 0.12968400 0.04804315 0.19821284
5:      x7 0.10600238 0.05148826 0.16450041
6:   depth 0.07087679 0.04485760 0.11251015
7:       y 0.06050565 0.03896716 0.08245329
8:   table 0.04577057 0.03135677 0.07554833
9:       z 0.03842355 0.04515944 0.06092608

6

তিয়ানকি চেন (2018) থেকে একটি উত্তর রয়েছে।

বৈশিষ্ট্যটির গুরুত্ব বিশ্লেষণে এই পার্থক্যের প্রভাব কোণার ক্ষেত্রে রয়েছে: পারস্পরিক সম্পর্কযুক্ত বৈশিষ্ট্যগুলি। দুটি বৈশিষ্ট্য পুরোপুরি সংযুক্ত, কল্পনা এ এবং বৈশিষ্ট্য বি কল্পনা করুন একটি নির্দিষ্ট গাছের জন্য, যদি অ্যালগরিদম এর মধ্যে একটির প্রয়োজন হয় তবে এটি এলোমেলোভাবে বেছে নেবে (উভয়কে বুস্টিং এবং এলোমেলো বন in)।

তবে, র্যান্ডম অরণ্যে rand প্রতিটি গাছের জন্য এই র্যান্ডম পছন্দটি করা হবে, কারণ প্রতিটি গাছ অন্যের থেকে স্বতন্ত্র। অতএব, আপনার পরামিতিগুলির উপর নির্ভর করে, প্রায় 50% গাছগুলি বৈশিষ্ট্য এ এবং অন্যান্য 50% বৈশিষ্ট্য বি বৈশিষ্ট্য চয়ন করবে So সুতরাং এ এবং বিতে থাকা তথ্যের গুরুত্ব (যা একই, কারণ তারা নিখুঁতভাবে সম্পর্কযুক্ত ) এ এবং বি তে মিশ্রিত হয় তাই আপনি সহজেই জানতে পারবেন না যে আপনি কী ভবিষ্যদ্বাণী করতে চান তা ভবিষ্যদ্বাণী করা গুরুত্বপূর্ণ! এটি আরও খারাপ যখন আপনার 10 টি সম্পর্কিত সম্পর্কযুক্ত বৈশিষ্ট্যগুলি থাকে ...

উত্সাহ দেওয়ার সময়, যখন বৈশিষ্ট্য এবং ফলাফলের মধ্যে একটি নির্দিষ্ট লিঙ্কটি অ্যালগরিদম দ্বারা শিখে নেওয়া হয়, তখন এটি এটিতে পুনরায় ফোকাস না করার চেষ্টা করবে (তাত্ত্বিকভাবে এটি ঘটে যা ঘটে, বাস্তবতা সবসময় এত সহজ নয়)। অতএব, সমস্ত গুরুত্ব বৈশিষ্ট্য এ বা বৈশিষ্ট্য বিতে হবে (তবে উভয়ই নয়)। আপনি জানবেন যে পর্যবেক্ষণ এবং লেবেলের মধ্যে লিঙ্কে একটি বৈশিষ্ট্যের গুরুত্বপূর্ণ ভূমিকা রয়েছে। আপনার যদি সেগুলির সমস্ত কিছু জানা দরকার তবে গুরুত্বপূর্ণ হিসাবে সনাক্ত করা সম্পর্কিতটির সাথে সম্পর্কিত বৈশিষ্ট্যগুলি অনুসন্ধান করা এখনও আপনার উপর নির্ভর করে।

সংক্ষিপ্তসার হিসাবে, এক্সগুস্ট এলোমেলোভাবে প্রতিটি গাছের সাথে সম্পর্কিত বৈশিষ্ট্যগুলি ব্যবহার করে না, যা এলোমেলো বন মডেল এমন পরিস্থিতিতে ভোগে।

তথ্যসূত্র :

তিয়ানকী চেন, মাইচেল বেনস্টি, টং হি। 2018 "Xgboost এর সাথে আপনার ডেটা সেটটি বুঝুন।" Https://cran.r-project.org/web/packages/xgboost/vignettes/discoverYourData.html#numeric-vs-categorical-variables


2

সন্দীপের জবাব সম্পর্কে একটি মন্তব্য: ধরে নিলে আপনার 2 টি বৈশিষ্ট্য অত্যন্ত কলিনিয়ার (সমান 99% সময় বলুন) প্রকৃতপক্ষে প্রতিটি বিভক্তিতে কেবল 1 টি বৈশিষ্ট্য নির্বাচিত হয়েছে, তবে পরবর্তী বিভাজনের জন্য, এক্সজিবি অন্যান্য বৈশিষ্ট্যটি নির্বাচন করতে পারে। সুতরাং, এক্সজিবি বৈশিষ্ট্য র‌্যাঙ্কিং সম্ভবত 2 টি কলিনার বৈশিষ্ট্যগুলিকে সমানভাবে স্থান দেবে। পূর্বের জ্ঞান বা অন্যান্য বৈশিষ্ট্য প্রক্রিয়াজাতকরণ ব্যতীত আপনার কাছে সরবরাহকৃত র‌্যাঙ্কিংয়ের প্রায় কোনও উপায় নেই যা সনাক্ত করতে পারে যে 2 টি বৈশিষ্ট্য কলিনিয়ার।

এখন, xgboost আউটপুট যে অপেক্ষাকৃত গুরুত্ব হিসাবে, এটি sklearn গ্রেডিয়েন্ট বুস্টাইন ট্রি গাছের র‌্যাঙ্কিংয়ের সাথে খুব মিল (বা সম্ভবত ঠিক অনুরূপ) হওয়া উচিত। ব্যাখ্যা জন্য এখানে দেখুন ।

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