-10 python Spark MLlib支持向量机
- 格式:pdf
- 大小:1.18 MB
- 文档页数:40
Python Spark MLlib 支持向量机1基本概念2SVM 分类程序3参数评估内容大纲4训练评估参数并找出最佳参数组合5预测定义最优超平面,将两类数据正确分开,并且使分类间隔最大。
主要任务:寻找最优超平面特点:分类准确性高、误差容忍度高程序关键步骤说明:import sysfrom time import time import pandas as pdimport matplotlib.pyplot as pltfrom pyspark.mllib.classification import SVMWithSGDfrom pyspark.mllib.regression import LabeledPointimport numpy as npfrom pyspark.mllib.evaluation import BinaryClassificationMetrics from pyspark.mllib.feature import StandardScaler 导入SVMWithSGD模块1)导入SVMWithSGD链接库程序关键步骤说明:2)加入数据标准化def PrepareData(sc):#-------------1.导入并转换数据---print("开始导入数据…")rawDataWithHeader = Sc.textFile(Path+ "data/train.tsv") header = rawDataWithHeader.first()rawData = rawDataWithHeader.filter(lambda x:x !=header) rData=rawData.map(lambda x: x.replace(" \"", ""))lines = rData.map(lambda x: x.split("\t "))print("共计: " + str(lines.count()) + "项")程序说明:2)加入数据标准化#------------2.建立训练评估所需数据print "标准化之前"categoriesMap = lines.map(lambda fields: fields[3]). \distinct().zipWithIndex().collectAsMap()labelRDD = lines.map(lambda r: extract_label(r))featureRDD = lines.map(lambda r; extract_ features(r,categoriesMap,len(r)-1)) for i in featureRDD.first():print (str(i)+", ”)print ""程序说明:2)加入数据标准化print "标准化之后"stdScaler = StandardScaler(withMean=True, withStd=True).fit(featureRDD) ScalerFeatureRDD=stdScaler.transform(featureRDD)for i in ScalerFeatureRDD.first():print (str(i)+", "),labelpoint=labelRDD.zip(ScalerFeatureRDD)labelpointRDD=labelpoint.map(lambda r: LabeledPoint(r[0], r[1]))程序说明:3)trainModel训练模型def trainEvaluateModel(trainData,validationData,numIterations, stepSize, regParam):startTime =time()model = SVMWithSGD.train(trainData, numIterations, stepSize, regParam)AUC = evaluateModel(model, validationData)使用SVMWithSGD进行逻辑回归分析训练duration =time() -startTimeprint"训练评估:使用参数"+" numlterations="+str(numlterations) +\" stepSize= "+str(stepSize) + " regParam= "+str(regParam) +\" 所需时间="+str(duration) + "结果AUC=" +str(AUC)return (AUC,duration, numIterations, stepSize, regParam,model)程序说明:3)trainModel训练模型SVMWithSGD.train(trainData, numIterations, stepSize, regParam)参数说明程序说明:4)parameterTunning函数def parametersEval(trainData, validationData):print(" ---评估numIterations参数使用---")evalParameter(trainData, validationData, "numIterations ",numIterationsList= [1,3,5, 15, 25],stepSizeList=[100],regParamList=[1 ])print(" -----评估stepSize参数使用-----" )evalParameter(trainData, validationData, "stepSize ",numIterationsList=[25],stepSizeList= [10, 50, 100, 200],regParamList=[1])程序说明:4)parameterTunning函数print(“----评估regParam参数使用-------",evalParameter(trainData, valldationData, "regParam",numIterationsList=[25],stepSizeList =[100],regParamList=[0.01, 0.1, 1 ])不同的参数值对准确率的影响以及运行所需要的时间。
评估的方法是同时间只评估一个参数。
程序说明:5)main函数if_ name__ == "_ main_ ":print( "RunSVMWithSGDBinary ")sc=CreateSparkContext()print(" ------数据准备阶段--------")(trainData, validationData, testData, categoriesMap) =PrepareData(sc) trainData.persist(); validationData.persist(); testData.persist()print ("------训练评估阶段--------")(AUC,duration, numIterations, stepSize, regParam,model)= \trainEvaluateModel(trainData, validationData,3, 50, 1) if (len(sys.argv) = 2) and (sys.argv[1]=="-e'"):parametersEval(trainData, valldationData)程序说明:5)main函数elif (len(sys.argv) =2) and (sys.argv[1]=="-a"):print(" ----所有参数训练评估找出最好的参数组合-------”)model=evalAllParameter(trainData, validationData,[1,3,5, 15, 25],[10, 50, 100, 200],[0.01, 0.1, 1])print(" ---------测试阶段------------")auc = evaluateModel(model, testData)print("使用test Data测试最佳模型,结果AUC:" + str(auc))print(" -----测试数据-----")PredictData(Sc, model, categoriesMap)1)运行外部程序2)输入参数“-e”3)numIterations参数评估可以看到numIterations=1时AUC最高,不过差异不大。
除了numIterations=1需要较多时间之外,其余随着numIterations增大所需的时间越来越多。
4)stepSize参数评估stepSize=200时AUC最高,在100之前,stepSize越大,所需时间越小5)regParam参数评估regParam=1时AUC最高,所需时间最少以evaluateAllParameter函数训练评估三种参数1)输入参数“-a”以evaluateAllParameter函数训练评估三种参数2)进行训练评估参数,找出最佳的参数组合找出最佳参数组合后可以修改trainEvaluateModel程序为最佳参数组合。
要运行预测程序时,可以不再运行训练评估,直接使用最佳参数进行预测。
1)修改trainEvaluateModel为最佳参数组合if_ name__ == "_ main_ ":print( "RunSVMWithSGDBinary ")sc=CreateSparkContext()print(" ------数据准备阶段--------")(trainData, validationData, testData, categoriesMap) =PrepareData(sc)trainData.persist(); validationData.persist(); testData.persist()print ("------训练评估阶段--------")(AUC,duration, numIterations, stepSize, regParam,model)= \修改为最佳参数组合trainEvaluateModel(trainData, validationData,3, 50, 1)if (len(sys.argv) = 2) and (sys.argv[1]=="-e'"):parametersEval(trainData, valldationData)2)运行外部程序3)不输入参数4)运行结果程序训练完成后进行了预测,因为不需要训练评估,所以运行时间比较少4)运行结果(1)数据准备阶段:显示导入项数以及trainData、validationData、testData项数。