此前用自己实现的随机森林算法,应用在titanic生还者预测的数据集上。事实上,有很多开源的算法包供我们使用。无论是本地的机器学习算法包sklearn 还是分布式的spark mllib,都是非常不错的选择。
Spark是目前比较流行的分布式计算解决方案,同时支持集群模式和本地单机模式。由于其通过scala语言开发,原生支持scala,同时由于python在科学计算等领域的广泛应用,Spark也提供了python的接口。
Spark的常用操作详见官方文档:
http://spark.apache.org/docs/latest/programming-guide.html
在终端下面键入如下命令,切换到spark的目录,进入相应的环境:
cd $SPARK_HOME
cd ./bin
./pyspark
可以看到,出现了python 的版本号以及spark的logo
此时,仍然是输入一句,运行一句并输出。可以事先编辑好脚本保存为filename然后:
./spark-submit filename
下面给出详细的代码:
- import pandas as pd
- import numpy as np
- from pyspark.mllib.regression import LabeledPoint
- from pyspark.mllib.tree import RandomForest
- #将类别数量大于2的类别型变量进行重新编码,并把数据集变成labeledPoint格式
- #df=pd.read_csv('/home/kim/t.txt',index_col=0)
- #for col in ['Pclass','embrk']:
- # values=df[col].drop_duplicates()
- # for v in values:
- # col_name=col+str(v)
- # df[col_name]=(df[col]==v)
- # df[col_name]=df[col_name].apply(lambda x:int(x))
- #df=df.drop(['Pclass','embrk'],axis=1)
- #df.to_csv('train_data')
- #读入数据集变成弹性分布式数据集RDD ,由于是有监督学习,需要转换为模型输入的格式LabeledPoint
- rdd=pyspark.SparkContext.textFile('/home/kim/train')
- train=rdd.map(lambda x:x.split(',')[1])
- train=train.map(lambda line:LabeledPoint(line[1],line[2:]))
- #模型训练
- model=RandomForest.trainClassifier\
- (train, numClasses=2, categoricalFeaturesInfo={},numTrees=1000,\
- featureSubsetStrategy="auto",impurity='gini', maxDepth=4, maxBins=32)
- #包含LabeledPoint对象的RDD,应用features方法返回其输入变量的值,label方法返回其真实类别
- data_p=train.map(lambda lp:lp.features)
- v=train.map(lambda lp:lp.label)
- prediction=model.predict(data_p)
- vp=v.zip(prediction)
- #最后输出模型在训练集上的正确率
- MSE=vp.map(lambda x:abs(x[0]-x[1]).sum())/vp.count()
- print("MEAN SQURE ERROR: "+str(MSE))
import pandas as pd
import numpy as np
from pyspark.mllib.regression import LabeledPoint
from pyspark.mllib.tree import RandomForest
#将类别数量大于2的类别型变量进行重新编码,并把数据集变成labeledPoint格式
#df=pd.read_csv('/home/kim/t.txt',index_col=0)
#for col in ['Pclass','embrk']:
# values=df[col].drop_duplicates()
# for v in values:
# col_name=col+str(v)
# df[col_name]=(df[col]==v)
# df[col_name]=df[col_name].apply(lambda x:int(x))
#df=df.drop(['Pclass','embrk'],axis=1)
#df.to_csv('train_data')
#读入数据集变成弹性分布式数据集RDD ,由于是有监督学习,需要转换为模型输入的格式LabeledPoint
rdd=pyspark.SparkContext.textFile('/home/kim/train')
train=rdd.map(lambda x:x.split(',')[1])
train=train.map(lambda line:LabeledPoint(line[1],line[2:]))
#模型训练
model=RandomForest.trainClassifier\
(train, numClasses=2, categoricalFeaturesInfo={},numTrees=1000,\
featureSubsetStrategy="auto",impurity='gini', maxDepth=4, maxBins=32)
#包含LabeledPoint对象的RDD,应用features方法返回其输入变量的值,label方法返回其真实类别
data_p=train.map(lambda lp:lp.features)
v=train.map(lambda lp:lp.label)
prediction=model.predict(data_p)
vp=v.zip(prediction)
#最后输出模型在训练集上的正确率
MSE=vp.map(lambda x:abs(x[0]-x[1]).sum())/vp.count()
print("MEAN SQURE ERROR: "+str(MSE))
后面可以多加测试,例如:
使用更大规模的数据集;
将数据集划分为训练集测试集,在训练集上建模在测试集上评估模型性能;
使用mllib里面的其他算法并比较效果,等等
欢迎大家与我交流!