Weka 算法总结以及接口使用

这个软件一般数学系用得多、引入  weka-stable 可以使用里面的算法接口、也可以直接启动他的窗体,他的支持算法比较全面要实现一般的机器学习算法或者改造植入到自己的系统都可以参考这个算法库。像一些小型的风控、数据分析等业务没必要使用 spark 等大数据平台的情况下比较有用、同时也支持可视化:

训练一个kmeans以及可视化:

    public static void visualizeClusters(Instances data, SimpleKMeans clusterer) throws Exception {
        ClusterEvaluation eval = new ClusterEvaluation();
        eval.setClusterer(clusterer);
        eval.evaluateClusterer(data);

        ClustererAssignmentsPlotInstances plotInstances = new ClustererAssignmentsPlotInstances();
        plotInstances.setClusterer(clusterer);
        plotInstances.setInstances(data);
        plotInstances.setClusterEvaluation(eval);
        plotInstances.setUp();

        VisualizePanel vp = new VisualizePanel();
        vp.setName("Cluster Visualization");
        vp.addPlot(plotInstances.getPlotData(clusterer.getClass().getName()));

        JFrame jf = new JFrame("Weka Clusterer Visualize: " + vp.getName());
        jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        jf.setSize(800, 600);
        jf.getContentPane().setLayout(new BorderLayout());
        jf.getContentPane().add(vp, BorderLayout.CENTER);
        jf.setVisible(true);
    }

可视化如下:


也可以界面操作:

import weka.gui.Main;
public class WekaGui {
    public static void main(String[] args) {
        Main.main(new String[]{});
    }
}

就会弹出界面:

下面是 Weka 支持的算法:
 

关联算法:
算法名称
算法描述
Java 类
Apriori
经典关联规则挖掘算法,基于频繁项集先验性质。
weka.associations.Apriori
FilteredAssociator
在应用关联规则学习之前进行过滤操作的关联算法。
weka.associations.FilteredAssociator
FPGrowth
高效的频繁模式挖掘算法,通过构建 FP 树实现频繁项集的发现。
weka.associations.FPGrowth
GeneralizedSequentialPatterns
用于序列模式挖掘,发现数据中的序列规律。
weka.associations.GeneralizedSequentialPatterns
PredictiveApriori
Apriori 算法的扩展,专注于预测缺失属性值。
weka.associations.PredictiveApriori
Tertius
关联规则挖掘算法,用于发现数据中的关联性。
weka.associations.Tertius
聚类算法:
算法名称
算法描述
Java 类
CLOPE
基于模糊逻辑的聚类算法,用于发现模糊的聚类结构。
weka.clusterers.CLOPE
Cobweb
一种增量式聚类算法,用于处理连续数据。
weka.clusterers.Cobweb
DBSCAN
密度聚类算法,根据样本点分布的密度进行聚类。
weka.clusterers.DBSCAN
EM
期望最大化算法,用于高斯混合模型的聚类。
weka.clusterers.EM
FarthestFirst
初始质心选择算法,选择距离最远的点作为初始质心。
weka.clusterers.FarthestFirst
FilteredClusterer
在应用聚类算法之前进行过滤操作的聚类算法。
weka.clusterers.FilteredClusterer
HierarchicalClusterer
层次聚类算法,通过构建聚类层次树进行聚类。
weka.clusterers.HierarchicalClusterer
MakeDensityBasedClusterer
基于密度的聚类算法,根据数据密度进行聚类。
weka.clusterers.MakeDensityBasedClusterer
OPTICS
基于密度的聚类算法,生成数据点的密度图。
weka.clusterers.OPTICS
SIB
数据流聚类算法,用于处理数据流中的聚类任务。
weka.clusterers.SIB
SimpleKMeans
KMeans 聚类算法,通过最小化簇内平方和实现聚类。
weka.clusterers.SimpleKMeans
XMeans
KMeans 变体,自动确定最优的簇数目。
weka.clusterers.XMeans
贝叶斯:
算法名称
算法描述
Java 类
AODE
属性特定独立的贝叶斯分类器。
weka.classifiers.bayes.AODE
AODEsr
属性特定独立的贝叶斯分类器,使用平滑技术。
weka.classifiers.bayes.AODEsr
BayesLogisticRegression
贝叶斯逻辑回归分类器,基于 Logistic Regression 模型。
weka.classifiers.bayes.BayesLogisticRegression
BayesNet
贝叶斯网络分类器,使用贝叶斯网络模型进行分类。
weka.classifiers.bayes.BayesNet
ComplementNativeBayes
补充型朴素贝叶斯分类器,处理非平衡数据集。
weka.classifiers.bayes.ComplementNativeBayes
DMNBtext
多项式朴素贝叶斯分类器,用于处理文本数据。
weka.classifiers.bayes.DMNBtext
HNB
增强型朴素贝叶斯分类器,结合了属性和类别的信息。
weka.classifiers.bayes.HNB
NativeBayes
朴素贝叶斯分类器,基于属性的条件独立性假设。
weka.classifiers.bayes.NaiveBayes
NativeBayesMultinomial
多项式朴素贝叶斯分类器,适用于多项离散数据。
weka.classifiers.bayes.NaiveBayesMultinomial
NativeBayesMultinomialUpdateable
可更新的多项式朴素贝叶斯分类器,适用于流式数据。
weka.classifiers.bayes.NaiveBayesMultinomialUpdateable
NativeBayesSimple
简单朴素贝叶斯分类器,用于处理离散数据。
weka.classifiers.bayes.NaiveBayesSimple
NativeBayesUpdateable
可更新的朴素贝叶斯分类器,适用于流式数据。
weka.classifiers.bayes.NaiveBayesUpdateable
WAODE
带权重的属性特定独立的贝叶斯分类器。
weka.classifiers.bayes.WAODE
函数实现:
算法名称
算法描述
Java 类
GaussianProcesses
高斯过程回归算法,用于回归问题。
weka.classifiers.functions.GaussianProcesses
IsotonicRegression
保序回归算法,用于回归问题。
weka.classifiers.functions.IsotonicRegression
LeastMedSq
最小中位数平方回归算法,用于回归问题。
weka.classifiers.functions.LeastMedSq
LibLINEAR
基于 LIBLINEAR 库的线性分类器。
weka.classifiers.functions.LibLINEAR
LibSVM
基于 LIBSVM 库的支持向量机分类器。
weka.classifiers.functions.LibSVM
LinearRegression
线性回归算法,用于回归问题。
weka.classifiers.functions.LinearRegression
Logistic
逻辑回归算法,用于分类问题。
weka.classifiers.functions.Logistic
MultilayerPerceptron
多层感知器神经网络分类器。
weka.classifiers.functions.MultilayerPerceptron
PaceRegression
PACE 回归算法,用于回归问题。
weka.classifiers.functions.PaceRegression
PLSClassifier
偏最小二乘分类器。
weka.classifiers.functions.PLSClassifier
RBFNetwork
径向基函数网络分类器。
weka.classifiers.functions.RBFNetwork
SimpleLogistic
简单逻辑回归算法,用于分类问题。
weka.classifiers.functions.SimpleLogistic
SMO
序列最小优化算法,用于支持向量机分类。
weka.classifiers.functions.SMO
SMOreg
序列最小优化算法,用于支持向量机回归。
weka.classifiers.functions.SMOreg
SPegasos
Pegasos 算法的 Java 实现,用于线性分类。
weka.classifiers.functions.SPegasos
VotedPerceptron
加权感知器分类器。
weka.classifiers.functions.VotedPerceptron
Winnow
Winnow 算法,用于二分类问题。
weka.classifiers.functions.Winnow
LAZY惰性学习:
算法名称
算法描述
Java 类
IB1
IB1 算法,邻居只选择一个最近的实例。
weka.classifiers.lazy.IB1
IBk
IBk 算法,邻居的数量是可调整的。
weka.classifiers.lazy.IBk
KStar
KStar 算法,实现 k-近邻算法。
weka.classifiers.lazy.KStar
LBR
局部贝叶斯规则学习器,结合贝叶斯算法和规则。
weka.classifiers.lazy.LBR
LWL
局部加权学习(Locally Weighted Learning)
weka.classifiers.lazy.LWL
META:
算法名称
算法描述
Java 类
AdaBoostM1
AdaBoost 算法的一种变体,使用多个弱分类器来构建强分类器。
weka.classifiers.meta.AdaBoostM1
AdditiveRegression
加法回归算法,用于回归问题。
weka.classifiers.meta.AdditiveRegression
AttributeSelectedClassifier
使用特征选择的分类器。
weka.classifiers.meta.AttributeSelectedClassifier
Bagging
Bagging 算法,通过对数据集进行有放回的随机采样训练多个模型。
weka.classifiers.meta.Bagging
ClassificationViaClustering
通过聚类进行分类。
weka.classifiers.meta.ClassificationViaClustering
ClassificationViaRegression
通过回归进行分类。
weka.classifiers.meta.ClassificationViaRegression
CostSensitiveClassifier
对分类器进行代价敏感学习,考虑分类错误的代价。
weka.classifiers.meta.CostSensitiveClassifier
CVParameterSelection
通过交叉验证选择参数。
weka.classifiers.meta.CVParameterSelection
Dagging
基于 DAG 结构的 Bagging 算法。
weka.classifiers.meta.Dagging
Decorate
通过生成多个噪声分类器改进性能。
weka.classifiers.meta.Decorate
END
Ensemble of Nested Dichotomies (END) 算法。
weka.classifiers.meta.END
FilteredClassifier
使用过滤器进行分类。
weka.classifiers.meta.FilteredClassifier
Grading
使用子分类器的评分进行组合。
weka.classifiers.meta.Grading
GridSearch
使用网格搜索来优化分类器的参数。
weka.classifiers.meta.GridSearch
LogitBoost
LogitBoost 算法,一种 Boosting 算法的变体。
weka.classifiers.meta.LogitBoost
MetaCost
对代价敏感分类器进行元学习。
weka.classifiers.meta.MetaCost
MultiBoostAB
AdaBoost 算法的变体,用于多类别分类。
weka.classifiers.meta.MultiBoostAB
MultiClassClassifier
多类别分类器,可将多个二进制分类器组合成一个多类别分类器。
weka.classifiers.meta.MultiClassClassifier
MultiScheme
使用多个分类器。
weka.classifiers.meta.MultiScheme
NestedDichotomies
分类的嵌套二分法算法。
weka.classifiers.meta.NestedDichotomies
ClassBalancedND
Class-Balanced Nested Dichotomies (ND) 算法。
weka.classifiers.meta.ClassBalancedND
DataNearBalancedND
Data-Near-Balanced Nested Dichotomies (ND) 算法。
weka.classifiers.meta.DataNearBalancedND
OrdinalClassClassifier
序数分类器,用于有序分类任务。
weka.classifiers.meta.OrdinalClassClassifier
RaceIncrementalLogitBoost
Race-Incremental LogitBoost 算法,用于增量学习。
weka.classifiers.meta.RaceIncrementalLogitBoost
RandomCommittee
随机委员会算法,通过训练多个分类器进行投票。
weka.classifiers.meta.RandomCommittee
RandomSubSpace
随机子空间算法,通过随机选择特征子集进行训练。
weka.classifiers.meta.RandomSubSpace
RegressionByDiscretization
通过将回归问题离散化为分类问题进行学习。
weka.classifiers.meta.RegressionByDiscretization
RotationForest
Rotation Forest 算法,一种 Ensemble 方法。
weka.classifiers.meta.RotationForest
Stacking
Stacking 算法,通过堆叠多个分类器进行学习。
weka.classifiers.meta.Stacking
StackingC
StackingC 算法,Stacking 的变体。
weka.classifiers.meta.StackingC
ThresholdSelector
阈值选择算法,用于选择分类器输出的阈值。
weka.classifiers.meta.ThresholdSelector
Vote
投票算法,通过投票决定最终的分类结果。
weka.classifiers.meta.Vote
MI:
算法名称
算法描述
Java 类
CitationKNN
基于引文的 k 近邻算法。
weka.classifiers.mi.CitationKNN
MDD
多示例多标签学习算法。
weka.classifiers.mi.MDD
MIBoost
多示例 Boosting 算法。
weka.classifiers.mi.MIBoost
MIDD
基于 Diverse Density 的多示例学习算法。
weka.classifiers.mi.MIDD
MIEMDD
多示例学习算法,结合 Diverse Density 和 Example Set 的信息。
weka.classifiers.mi.MIEMDD
MILR
多示例学习算法,使用标签关联的 Logit 模型。
weka.classifiers.mi.MILR
MINND
多示例学习算法,基于最近邻的策略。
weka.classifiers.mi.MINND
MIOptimalBall
多示例学习算法,通过球体进行实例分布建模。
weka.classifiers.mi.MIOptimalBall
MISMO
多示例学习算法,通过学习相似性矩阵进行分类。
weka.classifiers.mi.MISMO
MISVM
多示例学习算法,支持向量机。
weka.classifiers.mi.MISVM
MIWrapper
多示例学习算法的包装器,用于将基本分类器转换为多示例分类器。
weka.classifiers.mi.MIWrapper
SimpleMI
多示例学习算法,使用简单的实例权重。
weka.classifiers.mi.SimpleMI
MISC:
HyperPipes
多分类的支持向量机算法。
weka.classifiers.misc.HyperPipes
SerializedClassifier
序列化的分类器,用于加载已保存的模型。
weka.classifiers.misc.SerializedClassifier
VFI
变量频繁项集算法,用于特征选择。
weka.classifiers.misc.VFI
Ruler:
算法名称
算法描述
Java 类
ConjunctiveRule
由规则组成的模型,通过组合规则进行分类。
weka.classifiers.rules.ConjunctiveRule
DecisionTable
决策表模型,通过规则表进行分类。
weka.classifiers.rules.DecisionTable
DINB
直接从实例中学习的贝叶斯网络。
weka.classifiers.rules.DINB
JRip
基于规则的归纳算法,生成简化的规则集。
weka.classifiers.rules.JRip
M5Rules
使用M5算法生成的规则集模型。
weka.classifiers.rules.M5Rules
NNge
基于元启发式搜索的归纳算法,生成简化的规则集。
weka.classifiers.rules.NNge
OneR
基于单一规则的分类算法,选择最佳单一规则。
weka.classifiers.rules.OneR
PART
由部分规则组成的规则集模型。
weka.classifiers.rules.PART
Prism
基于二维网格的分割算法,生成规则集模型。
weka.classifiers.rules.Prism
Ridor
基于规则的分类算法,生成简化的规则集。
weka.classifiers.rules.Ridor
ZeroR
使用零规则进行分类的简单模型。
weka.classifiers.rules.ZeroR
Tree:
算法名称
算法描述
Java 类
ADTree
预测性模型,通过剪枝的决策树生成。
weka.classifiers.trees.ADTree
BFTree
通过自底向上的构建树生成的决策树。
weka.classifiers.trees.BFTree
DecisionStump
通过一棵深度为1的树生成的决策树。
weka.classifiers.trees.DecisionStump
FT
通过特征选择生成的决策树。
weka.classifiers.trees.FT
ID3
使用ID3算法生成的决策树。
weka.classifiers.trees.ID3
J48
使用C4.5算法生成的决策树。
weka.classifiers.trees.J48
J48graft
在C4.5基础上,使用修剪技术生成的决策树。
weka.classifiers.trees.J48graft
LADTree
通过局部加权回归生成的决策树。
weka.classifiers.trees.LADTree
LMI
通过基于信息理论的分割生成的决策树。
weka.classifiers.trees.LMI
M5P
基于模型树的回归算法,生成的决策树用于回归问题。
weka.classifiers.trees.M5P
NBTree
使用朴素贝叶斯分类器生成的决策树。
weka.classifiers.trees.NBTree
RandomForest
通过随机森林生成的决策树模型。
weka.classifiers.trees.RandomForest
RandomTree
使用随机特征选择生成的决策树。
weka.classifiers.trees.RandomTree
REPTree
基于回归树的决策树生成算法。
weka.classifiers.trees.REPTree
SimpleCart
使用基尼指数进行分割的简单决策树生成算法。
weka.classifiers.trees.SimpleCart
UserClassifier
允许用户定义分类器生成的决策树。
weka.classifiers.trees.UserClassifier
Weka 使用比较简单可以很方便的将机器学习算法嵌入到java应用中:
import weka.classifiers.Evaluation;
import weka.core.Instances;
import weka.core.SerializationHelper;
import weka.core.converters.CSVLoader;
import weka.classifiers.trees.J48;
import weka.filters.Filter;
import weka.filters.unsupervised.instance.RemovePercentage;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Random;

/**
 *   @desc : weka 决策树分类
 *   @auth : tyf
 *   @date : 2024-03-04  15:16:25
 */
public class WekaDecisionTree {

    // 生成随机训练样本
    public static void generateCsv(String csv){
        Random r = new Random();
        if(new File(csv).exists()){
            return;
        }
        // 写入到本地csv
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(csv, true))) {
            for (int i = 0; i < 10000; i++) {
                double f1 = r.nextDouble()*100;
                double f2 = r.nextDouble()*100;
                double f3 = r.nextDouble()*100;
                double f4 = r.nextDouble()*100;
                String label = "";
                double score = f1*10 + f2*5 + f3*5 - f4*5;
                if(score>=-500&&score<0){ label = "E";}
                else if(score>=0&&score<500){ label = "D";}
                else if(score>=500&&score<1000){ label = "C";}
                else if(score>=1000&&score<1500){ label = "B";}
                else if(score>=1500&&score<2000){ label = "A";}
                String line = f1 +","+ f2 + ","+f3 + ","+f4 + ","+label;
                writer.write(line);
                writer.newLine();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


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

        // 样本路径
        String csv = "C:\\Users\\tyf\\Desktop\\data.csv";
        // 模型保存和加载路径
        String module = "C:\\Users\\tyf\\Desktop\\j48.model";

        // 生成随机训练样本
        generateCsv(csv);

        // 读取数据
        CSVLoader loader = new CSVLoader();
        loader.setSource(new File(csv));

        // 数据集 Instances
        Instances data = loader.getDataSet();
        System.out.println("行:"+data.size()+",列:"+data.numAttributes());

        // 最后一列是 label
        data.setClassIndex(data.numAttributes()-1);

        // 划分训练集
        RemovePercentage data_08 = new RemovePercentage();
        data_08.setInputFormat(data);
        data_08.setPercentage(80); // 百分比
        data_08.setInvertSelection(true);

        // 划分验证集
        RemovePercentage data_02 = new RemovePercentage();
        data_02.setInputFormat(data);
        data_02.setPercentage(20); // 百分比
        data_02.setInvertSelection(true);

        Instances trainingData = Filter.useFilter(data, data_08);
        Instances validationData  = Filter.useFilter(data, data_02);

        System.out.println("训练集: "+trainingData.size()+" x "+trainingData.numAttributes());
        System.out.println("验证集: "+validationData.size()+" x "+validationData.numAttributes());

        // 决策树
        J48 tree = new J48();

        // 训练
        tree.buildClassifier(data);

        // 模型评估
        Evaluation evaluation = new Evaluation(trainingData);
        evaluation.evaluateModel(tree, validationData);

        // 打印概要信息
        System.out.println("=== Evaluation Summary ===");
        System.out.println(evaluation.toSummaryString());

        // 模型保存
        SerializationHelper.write(module, tree);
        J48 model = (J48) SerializationHelper.read(module);

        // 使用模型进行单个样本推理
        System.out.println("=== Predict ===");
        for (int i = 0; i < 30; i++) {
            // 预测 label 下标
            double prediction = model.classifyInstance(validationData.get(i));
            // 预测 label
            String predictedClass = validationData.classAttribute().value((int) prediction);
            // 真实的 label
            String trueClass = validationData.instance(i).stringValue(validationData.numAttributes() - 1);
            System.out.println("Sample: " + validationData.get(i) + " , True Class: " + trueClass + " , Predicted Class: " + predictedClass);
        }

    }


}

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0x13

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值