Java集成Weka做线性回归的例子
2016-07-14 15:42
423 查看
之前研究完分类的逻辑回归,继续搞一下线性回归看看。线性回归在数据挖掘领域应也是非常常见,即根据现有的数据集(行向量组成的矩阵),(训练)模拟出一个合适的规律(函数),来推测任何新给出的数据组合(向量)应该得到的值。
具体的描述可以参见各种博客,怎么推导的看来看去一知半解,但总而言之结果也简单,就是计算得到一个“适当”的多元线性函数Y=a0+a1*x1+a2*x2+a3*x3+…+ak*xk。我就不在这里Ctrl+v了。下面只看看代码上如何集成。
Weka中有对应的线性回归LinearRegression。使用起来道理也一样,就是先构造模型,然后使用;使用时就是构造一个Instance,然后用classifyInstance函数来得到预测值。
训练模型
我使用了IBM技术博客上的一个数据样本(根据房子的面积、房间数、浴室数等,预测房子的房价):
但有一点让我比较困惑,就是如何构造一个数据实例,用来作为模型预测的参数(自变量向量)。因为classifyInstance函数,是接收一个数据实例的(即自变量向量)weka.core.Instance,而且搜索看到人家是这样构造的:
但实际上这个根本编译不过,找了原因:weka.core.Instance是一个interface!(难道早期的版本Instance是一个可以实例化的类吗?)
在Weka API文档 找找,还是可以看到有其实现类的。
这样一来,代码就可以写了:
用模型来预测
运行一下:
感兴趣看看这个模型是怎么样的,可以打印出模型求解出来的各个系数。
运行一下看看,可以得到:
有两个系数是0,对应arff文件可以得知,granite 是对结果没有影响的。第二个0的系数,是不是对应了price价格的位置,因为price是被预测的因变量,所以系数也一定为0。
因此这个模型的解读是:
具体的描述可以参见各种博客,怎么推导的看来看去一知半解,但总而言之结果也简单,就是计算得到一个“适当”的多元线性函数Y=a0+a1*x1+a2*x2+a3*x3+…+ak*xk。我就不在这里Ctrl+v了。下面只看看代码上如何集成。
Weka中有对应的线性回归LinearRegression。使用起来道理也一样,就是先构造模型,然后使用;使用时就是构造一个Instance,然后用classifyInstance函数来得到预测值。
训练模型
static AbstractClassifier trainModel(String arffFile, int classIndex) throws Exception { File inputFile = new File(arffFile); //训练文件 ArffLoader loader = new ArffLoader(); loader.setFile(inputFile); Instances insTrain = loader.getDataSet(); // 读入训练文件 insTrain.setClassIndex(classIndex); LinearRegression linear = new LinearRegression(); linear.buildClassifier(insTrain);//根据训练数据构造分类器 return linear; }
我使用了IBM技术博客上的一个数据样本(根据房子的面积、房间数、浴室数等,预测房子的房价):
@RELATION house @ATTRIBUTE houseSize NUMERIC @ATTRIBUTE lotSize NUMERIC @ATTRIBUTE bedrooms NUMERIC @ATTRIBUTE granite NUMERIC @ATTRIBUTE bathroom NUMERIC @ATTRIBUTE sellingPrice NUMERIC @DATA 3529,9191,6,0,0,205000 3247,10061,5,1,1,224900 4032,10150,5,0,1,197900 2397,14156,4,1,0,189900 2200,9600,4,0,1,195000 3536,19994,6,1,1,325000 2983,9365,5,0,1,230000
但有一点让我比较困惑,就是如何构造一个数据实例,用来作为模型预测的参数(自变量向量)。因为classifyInstance函数,是接收一个数据实例的(即自变量向量)weka.core.Instance,而且搜索看到人家是这样构造的:
Instance ins = new weka.core.Instance(numOfFields);
但实际上这个根本编译不过,找了原因:weka.core.Instance是一个interface!(难道早期的版本Instance是一个可以实例化的类吗?)
在Weka API文档 找找,还是可以看到有其实现类的。
这样一来,代码就可以写了:
用模型来预测
public static void main(String[] args) throws Exception { final String arffTrainData = "data/house.arff"; AbstractClassifier classifier = trainModel(arffTrainData, 5); Instance ins = new weka.core.SparseInstance(5); ins.setValue(0, 990.8); ins.setValue(1, 1080.8); ins.setValue(2, 3); ins.setValue(3, 0); ins.setValue(4, 1); double price = classifier.classifyInstance(ins); System.out.println("Price: " + price); }
运行一下:
Price: 131311.66927984258
感兴趣看看这个模型是怎么样的,可以打印出模型求解出来的各个系数。
LinearRegression linear = new LinearRegression(); ...... for (double coef : linear.coefficients()) { System.out.println(coef); }
运行一下看看,可以得到:
-26.688240074108368 7.055124244983151 43166.07667227803 0.0 42292.09008972738 0.0 -21661.120845270096
有两个系数是0,对应arff文件可以得知,granite 是对结果没有影响的。第二个0的系数,是不是对应了price价格的位置,因为price是被预测的因变量,所以系数也一定为0。
因此这个模型的解读是:
sellingPrice = -26.6882 * houseSize + 7.0551 * lotSize + 43166.0767 * bedrooms + 42292.0901 * bathroom + -21661.1208
相关文章推荐
- 数据挖掘之Apriori算法详解和Python实现代码分享
- Python编程实现使用线性回归预测数据
- 详解BI/数据分析/数据挖掘/业务分析概念 7fe0
- Sedgewick之巨著《算法》,与高德纳TAOCP一脉相承
- 普通最小二乘法的推导证明
- 最老程序员创业札记:全文检索、数据挖掘、推荐引擎应用2
- 数据挖掘项目的特征和关键环节
- 聚类算法总结
- 一位数据挖掘成功人士给数据挖掘在读研究生的建议
- 数据挖掘网上资料大全
- 数据挖掘技术与用户知识获取
- Data mining 数据挖掘
- weka中的数据预处理
- 数据挖掘分类算法的评价指标
- 数据挖掘
- 大数据,且行且思( 文/ 占超群)
- 转载 以LibSvm为例给出weka输出结果的简单翻译 [WEKA使用]
- HUNTER
- kmeans python版
- 数据挖掘-聚类-K-means算法Java实现