第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 Java Weka API 中使用類不平衡技術(shù) (SMOTE)?

如何在 Java Weka API 中使用類不平衡技術(shù) (SMOTE)?

慕田峪7331174 2022-01-06 17:23:35
我正在嘗試使用 Java Weka API 構(gòu)建分類模型。我的訓練數(shù)據(jù)集存在類別不平衡問題。出于這個原因,我想使用像 SMOTE 這樣的類不平衡技術(shù)來減少類不平衡問題。源代碼如下:package classification;import java.util.Random;import weka.classifiers.Classifier;import weka.classifiers.bayes.NaiveBayesMultinomial;import weka.core.Instance;import weka.core.Instances;import weka.core.converters.ConverterUtils.DataSource;import weka.filters.Filter;import weka.filters.unsupervised.attribute.StringToWordVector;public class questStackoverflow {public static void main(String agrs[]) throws Exception{String fileRootPath = "../file.arff"; //Dataset    Instances strdata = DataSource.read(fileRootPath); //Load Dataset    StringToWordVector filter = new StringToWordVector(10000);    filter.setInputFormat(strdata);    String[] options = { "-W", "10000", "-L", "-M", "1",            "-stemmer", "weka.core.stemmers.IteratedLovinsStemmer",             "-stopwords-handler", "weka.core.stopwords.Rainbow",             "-tokenizer", "weka.core.tokenizers.AlphabeticTokenizer"             };    filter.setOptions(options);    filter.setIDFTransform(true);    Instances data = Filter.useFilter(strdata,filter); //Apply filter    data.setClassIndex(0); //set class index            double recall=0.0;    double precision=0.0;    double fmeasure=0.0;    double tp, fp, fn, tn;    Classifier classifier = null;    classifier = new NaiveBayesMultinomial(); //classifer                }            }           }我的代碼在沒有類不平衡技術(shù)的情況下運行良好。但是,我需要使用類不平衡技術(shù)來緩解類不平衡問題。但是,我不知道如何在 Java Weka API 中使用它。
查看完整描述

1 回答

?
幕布斯7119047

TA貢獻1794條經(jīng)驗 獲得超8個贊

您可以在代碼中添加以下代碼行:


weka.filters.supervised.instance.SMOTE



SMOTE smote=new SMOTE();

smote.setInputFormat(trains);       

Instances Trains_smote= Filter.useFilter(trains, smote);

您的代碼如下。


package classification;

import java.util.Random;

import weka.classifiers.Classifier;

import weka.classifiers.bayes.NaiveBayesMultinomial;

import weka.core.Instance;

import weka.core.Instances;

import weka.core.converters.ConverterUtils.DataSource;

import weka.filters.Filter;

import weka.filters.unsupervised.attribute.StringToWordVector;

weka.filters.supervised.instance.SMOTE

public class questStackoverflow {

public static void main(String agrs[]) throws Exception{

String fileRootPath = "../file.arff"; //Dataset

Instances strdata = DataSource.read(fileRootPath); //Load Dataset

StringToWordVector filter = new StringToWordVector(10000);

filter.setInputFormat(strdata);

String[] options = { "-W", "10000", "-L", "-M", "1",

        "-stemmer", "weka.core.stemmers.IteratedLovinsStemmer", 

        "-stopwords-handler", "weka.core.stopwords.Rainbow", 

        "-tokenizer", "weka.core.tokenizers.AlphabeticTokenizer" 

        };

filter.setOptions(options);

filter.setIDFTransform(true);

Instances data = Filter.useFilter(strdata,filter); //Apply filter

data.setClassIndex(0); //set class index        

double recall=0.0;

double precision=0.0;

double fmeasure=0.0;

double tp, fp, fn, tn;


Classifier classifier = null;

classifier = new NaiveBayesMultinomial(); //classifer


int folds = 10;         

Random random = new Random(1);

data.randomize(random);

data.stratify(folds);

tp = fp = fn = tn = 0;

for (int i = 0; i < folds; i++) {

   Instances trains = data.trainCV(folds, i,random); //training dataset

   Instances tests = data.testCV(folds, i); //testing dataset

   SMOTE smote=new SMOTE();

   smote.setInputFormat(trains);        

   Instances Trains_smote = Filter.useFilter(trains, smote);


    classifier.buildClassifier(Trains_smote);    //build classifier           

    for (int j = 0; j < tests.numInstances(); j++) {    

       Instance instance = tests.instance(j);

       double classValue = instance.classValue();                   

       double result = classifier.classifyInstance(instance);

        if (result == 0.0 && classValue == 0.0) {

                tp++;

            } else if (result == 0.0 && classValue == 1.0) {

                fp++;

            } else if (result == 1.0 && classValue == 0.0) {

                fn++;

            } else if (result == 1.0 && classValue == 1.0) {

                tn++;

            }

        }   

    }


    if (tn + fn > 0)

        precision = tn / (tn + fn);

    if (tn + fp > 0)

        recall = tn / (tn + fp);

    if (precision + recall > 0)

        fmeasure = 2 * precision * recall / (precision + recall);

    System.out.println("Precision: " + precision);

    System.out.println("Recall: " + recall);

    System.out.println("Fmeasure: " + fmeasure);


}

}


查看完整回答
反對 回復 2022-01-06
  • 1 回答
  • 0 關(guān)注
  • 280 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號