我使用的是Weka自带的示例数据集
weka.core.Instances
容纳完整的数据集,可以提取行信息与列信息
weka.core.Instance
一行信息,没有列信息
weka.core.Attribute
列信息
一、加载数据
1.从文件中加载数据
基本的读取数据方式为
Instances data1=DataSource.read("data\\iris.arff");
如果文件的拓展名未知,我们可以指定加载器进行加载,例如我们可以把之前的iris.arff文件改成iris.data,然后通过指定加载器加载本地数据
package weka.loaddata;
import java.io.File;
import weka.core.Instances;
import weka.core.converters.ArffLoader;
public class Test {
public static void main(String[] args) {
try {
ArffLoader loader=new ArffLoader();
loader.setSource(new File("data\\iris.data"));
Instances data1=loader.getDataSet();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("done");
}
}
arff和csv需要人为指定作为类别的字段
package weka.loaddata;
import weka.core.Instances;
import weka.core.converters.ConverterUtils.DataSource;
public class Test {
public static void main(String[] args) {
try {
Instances data1=DataSource.read("data\\iris.arff");
System.out.println(data1.classIndex());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("done");
}
}
返回-1代表此时并没有指定类别属性
package weka.loaddata;
import weka.core.Instances;
import weka.core.converters.ConverterUtils.DataSource;
public class Test {
public static void main(String[] args) {
try {
Instances data1=DataSource.read("data\\iris.arff");
data1.setClassIndex(data1.numAttributes()-1);
System.out.println(data1.classIndex());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("done");
}
}
于是我们通过上述程序将最后一个属性作为类别属性
2.从数据库加载数据
一种是InstanceQuery,允许检索系数数据,一种是DatabaseLoader,允许增量检索
package weka.loaddata;
import weka.core.Instances;
import weka.experiment.InstanceQuery;
public class Test {
public static void main(String[] args) throws Exception {
InstanceQuery query = new InstanceQuery();
query.setDatabaseURL("jdbc:mysql://localhost:3306/new_schema");
query.setUsername("root");
query.setPassword("*******");
query.setQuery("select * from iris");
Instances data = query.retrieveInstances();
System.out.println("done");
}
}
我首先将iris数据加载进mysql数据库了
如果你用过jdbc的话,会发现这几个东西就是用的jdbc
package weka.loaddata;
import weka.core.Instances;
import weka.core.converters.DatabaseLoader;
public class Test {
public static void main(String[] args) throws Exception {
DatabaseLoader loader = new DatabaseLoader();
loader.setSource("jdbc:mysql://localhost:3306/new_schema", "root",
"*******");
loader.setQuery("select * from iris");
Instances data = loader.getDataSet();
}
}
批量检索
package weka.loaddata;
import weka.core.Instance;
import weka.core.Instances;
import weka.core.converters.DatabaseLoader;
public class Test {
public static void main(String[] args) throws Exception {
DatabaseLoader loader = new DatabaseLoader();
loader.setSource("jdbc:mysql://localhost:3306/new_schema", "root",
"zxy123456");
loader.setQuery("select * from iris");
Instances structure = loader.getStructure();
Instances data = new Instances(structure);
Instance inst;
while ((inst = loader.getNextInstance(structure)) != null)
data.add(inst);
System.out.println("done");
}
}
增量检索
3.手把手
二、保存数据
package weka.loaddata;
import java.io.File;
import java.io.FileOutputStream;
import weka.core.Instances;
import weka.core.converters.ConverterUtils.DataSink;
import weka.core.converters.ConverterUtils.DataSource;
import weka.core.converters.XRFFSaver;
public class Test {
public static void main(String[] args) throws Exception {
Instances data = DataSource.read("data/iris.arff");
DataSink.write("data/write_iris.csv", data);
FileOutputStream arff = new FileOutputStream("data/write_iris.arff");
DataSink.write(arff, data);
arff.close();
XRFFSaver saver = new XRFFSaver();
saver.setInstances(data);
saver.setFile(new File("data/write_iris.xrff"));
saver.writeBatch();
System.out.println("done");
}
}
可以直接写,也可以指定加载器
2.保存数据到数据库
package weka.loaddata;
import weka.core.Instances;
import weka.core.converters.ConverterUtils.DataSource;
import weka.core.converters.DatabaseSaver;
public class Test {
public static void main(String[] args) throws Exception {
Instances data = DataSource.read("data/iris.arff");
DatabaseSaver saver = new DatabaseSaver();
saver.setDestination("jdbc:mysql://localhost:3306/new_schema", "root",
"zxy123456");
saver.setTableName("write_iris");
saver.setRelationForTableName(false);
saver.setInstances(data);
saver.writeBatch();
System.out.println("done");
}
}
saver.setRelationForTableName(false);
如果是true的话,只能将数据的relation名作为表名,当然也可以改关系名啦
data.setRelationName(newName);
pack