WekaAPI的学习(加载数据)

本文介绍如何使用Weka从文件及数据库加载数据,包括ARFF、CSV格式文件和通过JDBC连接MySQL数据库的方法。详细步骤涉及配置环境变量、修改DatabaseUtils.props文件、重新打包weka.jar等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法参考《文本挖掘原理》 程显毅 朱倩 编著
工具书 《数据挖掘与机器学习-Weka应用技术与实践》

1 从文件加载数据

  1. Weka处理的数据表格中,一个横行称为一个实例(Instance),竖行代表一个属性(Arrtibute),数据表格称为一个数据集,在weka看来,呈现了属性之间的一种关系(Relation)
  2. Weka存储数据的格式是ARFF(Attribute-RelationFile Format)文件,这是一种ASCII文本文件。
  3. Weka的ARFF文件可以分为两部分。第一部分给出了头信息(Head information),包括了对关系的声明和对属性的声明。第二部分给出了数据信息(Data information),即数据集中给出的数据。从@Data标记开始,后面的就是数据信息了。
  4. Weka作为数据挖掘,面临的第一个问题往往是我们的数据不是ARFF格式的。幸好,WEKA还提供了对CSV文件的支持,而这种格式是被许多其他软件所支持的。此外,WEKA还提供了通过JDBC访问数据库的功能。

文件加载数据有两种方式:

  • 扩展名正确的文件直接使用Weka直接使用合适的加载器加载
  • 扩展名不符合,需要用户指定加载器。

2 从数据库加载数据

准备工作:

  • Windows 7 64bit
  • jdk7
  • weka-3-7
  • mysql5
  • Myeclipse
2.1 需要的jar包

下载链接:Weka链接Mysql使用的jar包
参考学习链接参考

2.2 具体的配置
  • 安装weka
  • 安装mysql
  • 在weka安装程序文件夹下新建lib文件夹,将数据库Driver for JDBC(jar包)拷贝进\lib
  • 设置环境变量
  • WEKA_HOME=C:\Program Files\Weka-3-7
    ClassPath=.;%WEKA_HOME%\lib\mysql-connector-java-5.1.6-in.jar;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar设置完成后,weka就能找到放在\lib中的数据库jar包了.
  • 修改DatabaseUtils.props
    首先将weka.jar解压到weka目录,在weka\experiment\你会看到:…

DatabaseUtils.props

DatabaseUtils.props.hsql

DatabaseUtils.props.mssqlserver2005

DatabaseUtils.props.mssqlserver

DatabaseUtils.props.mysql

DatabaseUtils.props.odbc

DatabaseUtils.props.oracle

DatabaseUtils.props.postgresql

我们这里使用的是mysql数据库,所以我们将DatabaseUtils.props.mysql取代DatabaseUtils.props,并且修改文件的内容。
主要是将内容修改为:
第一步:配置相关的数据库驱动和链接信息

# Database settings for MySQL 3.23.x, 4.x
#
# General information on database access can be found here:
# http://weka.wikispaces.com/Databases
#
# url:     http://www.mysql.com/
# jdbc:    http://www.mysql.com/products/connector/j/
# author:  Fracpete (fracpete at waikato dot ac dot nz)
# version: $Revision: 11885 $

# JDBC driver (comma-separated list)
#jdbcDriver=org.gjt.mm.mysql.Driver
jdbcDriver=com.mysql.jdbc.Driver

# database URL
#jdbcURL=jdbc:mysql://server_name:3306/database_name
jdbcURL=jdbc:mysql://127.0.0.1:3306/test

第二步: 类型去掉注释

# specific data types  
string, getString() = 0;    --> nominal
boolean, getBoolean() = 1;  --> nominal
double, getDouble() = 2;    --> numeric
byte, getByte() = 3;        --> numeric
short, getByte()= 4;        --> numeric
int, getInteger() = 5;      --> numeric
long, getLong() = 6;        --> numeric
float, getFloat() = 7;      --> numeric
date, getDate() = 8;        --> date
text, getString() = 9;      --> string
time, getTime() = 10;       --> date
timestamp, getTime() = 11;  --> date

第三步:添加字符转换方式

#mysql-conversion
#Text
CHAR=0
TINYTEXT=0
TEXT=9
VARCHAR=0
LONGVARCHAR=0
BINARY=0
VARBINARY=0
LONGVARBINARY=0
BLOB=0
MEDIUMTEXT=0
MEDIUMBLOB=0
LONGTEXT=0
LONGBLOB=0

#Number types
BIT=1
NUMERIC=2
DECIMAL=2
FLOAT=7
DOUBLE=2
TINYINT=3
SMALLINT=4
#SHORT=4
SHORT=5
INTEGER=5
INT=5
MEDIUMINT=5
BIGINT=6
LONG=6
INT_UNSIGNED=6

#Data Types
REAL=7
DATE=8
TIME=8
TIMESTAMP=8
DATETIME=8

# other options
CREATE_DOUBLE=DOUBLE
CREATE_STRING=TEXT
CREATE_INT=INT
CREATE_DATE=DATETIME
DateFormat=yyyy-MM-dd HH:mm:ss
checkUpperCaseNames=false
checkLowerCaseNames=false
checkForTable=true

第四步:重新打包weka .jar Java命令如下
路径需要定位当weka\下

jar cvf weka.jar weka\*.* org\*.* java_cup\*.*

第五步:将原来的weka.jar备份到bak文件夹下面,然后将自己刚刚打包完毕的weka.jar替换掉原来的weka.jar。

第六步:新建java工程,导入驱动包和weka包。进行代码编写和设计。

3. 测试演示程序

package sdust.lab207.data;

import java.io.File;

import weka.core.Instance;
import weka.core.Instances;
import weka.core.converters.ArffLoader;
import weka.core.converters.DatabaseLoader;
import weka.core.converters.ConverterUtils.DataSource;
import weka.experiment.InstanceQuery;

/**
 * @author LbZhang
 * @version 创建时间:2016年6月10日 上午10:16:23
 * @description 数据加载 weka.core.Instances;
1.Weka处理的数据表格中,一个横行称为一个实例(Instance),竖行代表一个属性(Arrtibute),数据表格称为一个数据集,在weka看来,呈现了属性之间的一种关系(Relation)
2.Weka存储数据的格式是ARFF(Attribute-RelationFile Format)文件,这是一种ASCII文本文件。
3.Weka的ARFF文件可以分为两部分。第一部分给出了头信息(Head information),包括了对关系的声明和对属性的声明。第二部分给出了数据信息(Data information),即数据集中给出的数据。从@Data标记开始,后面的就是数据信息了。
4.Weka作为数据挖掘,面临的第一个问题往往是我们的数据不是ARFF格式的。幸好,WEKA还提供了对CSV文件的支持,而这种格式是被许多其他软件所支持的。此外,WEKA还提供了通过JDBC访问数据库的功能。 
 */
public class DataLoad {

    /**
     * Open Declaration weka.core.converters.ConverterUtils.DataSource
     * DataSource(数据源)类是weka.core.converters.ConverterUtils的内部类,用于从有适当文件扩展名的文件中读取数据。
     * 
     * 
     */

    public static void main(String[] args) {

        //DataLoad.testFileload();
        DataLoad.testDBload();

    }

    private static void testDBload() {
        try {
            //InstanceQuery使用
            InstanceQuery iq = new InstanceQuery();
            iq.setDatabaseURL("jdbc:mysql://127.0.0.1:3306/jdtaobao");
            iq.setUsername("root");
            iq.setPassword("root");
            iq.setQuery("SELECT * FROM tb_timestat");
            //iq.setSparseData(true);
            Instances ist = iq.retrieveInstances();

            System.out.println(ist.checkForStringAttributes());

            System.out.println(ist.get(0));
            System.out.println(ist.attributeStats(0));
           // System.out.println(ist.get(2));

            DatabaseLoader dloader = new DatabaseLoader();
            String jdurl="jdbc:mysql://127.0.0.1:3306/jdtaobao";
            String user = "root";
            String pass = "root";
            dloader.setSource(jdurl,user,pass);
            dloader.setQuery("SELECT * FROM tb_timestat");
            //批量检索
            Instances data = dloader.getDataSet();
//          System.out.println(data.classIndex());
//          System.out.println(data.size());
//          System.out.println(data.get(0));
            System.out.println(data.get(data.size()-1));
            System.out.println(data);
            System.out.println();

            //增量检索
            DatabaseLoader diloader = new DatabaseLoader();
            diloader.setSource(jdurl,user,pass);
            diloader.setQuery("SELECT * FROM tb_user");

            Instances structure = diloader.getStructure();

            Instances insts = new Instances(structure);
            Instance inst ;
            while((inst=diloader.getNextInstance(structure))!=null){
                System.out.println(inst);
                insts.add(inst);
            }
            System.out.println(insts);


        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    private static void testFileload() {
        try {

            // 读取数据代码片段
            Instances data1 = DataSource.read("data\\cpu.arff");
            Instances data2 = DataSource.read("data\\cpu.arff");
            // 当要加载的文件的与加载器通常关联的文件扩展名不同时,用户只能直接指定加载器。
            // 加载arrf文件代码片段
            ArffLoader loader = new ArffLoader();
            loader.setSource(new File("data\\cpu.arff"));
            Instances data = loader.getDataSet();// 获取数据集合

            System.out.println(data.classIndex());

            // 如果没有设置类别属性
            if (data.classIndex() == -1)
                data.setClassIndex(0);
            // 使用第一个属性作为类别属性            
            if (data.classIndex() == -1)
                data.setClassIndex(data.numAttributes()-1);

            if (data.classIndex() == -1) {//如果没有设置类别属性列
                System.out.println(data1.get(0));
            }
            //System.out.println(data.attribute(0));



        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

4. 错误处理

couldn’t read from database unknown data type: INT, Add Entry in weka/experiment/DatabaseUtils.props.

问题解决:
主要是因为数据库数据类型 java 数据类型还有weka 数据类型的匹配导致的。
因此第三步是十分重要的!
INT_UNSIGNED=6
VARCHAR=0
等一定要注意INT_UNSIGNED的连接下划线。

第三步:添加字符转换方式
#mysql-conversion
#Text
CHAR=0
TINYTEXT=0
TEXT=9
VARCHAR=0
LONGVARCHAR=0
BINARY=0
VARBINARY=0
LONGVARBINARY=0
BLOB=0
MEDIUMTEXT=0
MEDIUMBLOB=0
LONGTEXT=0
LONGBLOB=0

#Number types
BIT=1
NUMERIC=2
DECIMAL=2
FLOAT=7
DOUBLE=2
TINYINT=3
SMALLINT=4
#SHORT=4
SHORT=5
INTEGER=5
INT=5
MEDIUMINT=5
BIGINT=6
LONG=6
INT_UNSIGNED=6

#Data Types
REAL=7
DATE=8
TIME=8
TIMESTAMP=8
DATETIME=8
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值