1、网页分类问题
网页分类是一个经典的问题,例如:雅虎网站早期就是通过人工对网站进行分类以便于其他用户查找资料。网页分类的角度有多种,如:a、按网页类型(新闻、财经、体育、科技……);b、按网页内容:
- 暂时性的(ephemeral):文章只是在某一段时间内对读者有意义,过了这段时间就没有意义了,如:当日股市涨跌新闻;
- 长青的(evergreen):读者长久会对这些文章感兴趣,如:理财观念、育儿知识等。
本文考虑的就是按网页内容将网页分为暂时性的与长青的,是一个二元分类问题。
2、数据预处理
字段 0~2:网址、网址id、样板文字,与我们的分类问题关系不大,忽略。
字段3-25:特征字段,参考
字段26:标签,1代表长青网页,0代表暂时性的网页。
from pyspark import SparkContext
sc = SparkContext()
def PrepareData(sc):
#----------------------1.导入并转换数据-------------
global Path
if sc.master[0:5]=="local" :
Path="D:\\data\\input\\"
else:
Path="hdfs://master:9000/user/hduser/"
#如果要在cluster模式运行(hadoop yarn 或Spark Stand alone),请先把文件上传到HDFS目录
print("开始导入数据...")
rawDataWithHeader = sc.textFile(Path+"webpage_classify\\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.建立训练评估所需数据 RDD[LabeledPoint]-------
categoriesMap = lines.map(lambda fields: fields[3]).\
distinct().zipWithIndex().collectAsMap()
labelpointRDD = lines.map( lambda r:
LabeledPoint(
extract_label(r),
extract_features(r,categoriesMap,-1)))
labelpointRDDFeaturesInfo = lines.map( lambda r:LabeledPoint(
extract_label(r),
extract_features_FeaturesInfo(r,categoriesMap,len(r) - 1)))
#-----------3.以随机方式将数据分为3个部分并且返回-------------
(trainData, validationData, testData) = labelpointRDD.randomSplit([8, 1, 1])
print("将数据分trainData:" + str(trainData.count()) +
" validationData:" + str(validationData.count()) +
" testData:" + str(testData.count()))
return (trainData, validationData, testData, categoriesMap) #返回数据
(trainData, validationData, testData, categoriesMap) =PrepareData(sc)
trainData.persist()
validationData.persist()
testData.persist()
3、模型训练
DecisionTree是MLLib中的决策树实现,需要设置以下参数:
maxBins:决策树每一个节点最大分支数
maxDepth参数:决策树最大深度
impurity参数:决策树分裂节点时的方法,如:Gini指数与熵。
Gini指数:用于计算数值散布程度的指标,决策树算法对每种特征字段分隔点计算估值,选择分裂后最小的基尼指数方式。
熵:计算系统混乱程度。决策树算法对每种特征字段分隔点计算估值,选择分裂后最小熵的方式。
from pyspark.mllib.tree import DecisionTree
model=DecisionTree.trainClassifier( \
trainData, numClasses=2, categoricalFeaturesInfo={}, \
impurity="entropy", maxDepth=5, maxBins=5)
4、使用模型进行预测
def PredictData(sc,model,categoriesMap):
print("开始导入数据...")
rawDataWithHeader = sc.textFile(Path+"webpage_classify\\test.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()) + "项")
dataRDD = lines.map(lambda r: ( r[0] , # r[0] 用来标识具体网页
extract_features(r,categoriesMap,len(r) )))#此处的数据是元组,即(网页,特征)
DescDict = {
0: "暂时性网页(ephemeral)",
1: "长青网页(evergreen)"
}
for data in dataRDD.take(10):
predictResult = model.predict(data[1])
print(data[1])
print("\n")
print (" 网址: " +str(data[0])+"\n" +\
" ==>预测:"+ str(predictResult)+ \
" 说明:"+DescDict[predictResult] +"\n")
5、模型评估
采用AUC(Area under the Curve of ROC)的评估方式。
纵坐标:TPR=TP/(TP+FN) ——在所有实际为1的样本中,被正确地判断为1的比例。
横坐标:FPR=FP/(FP+TN) ——在所有实际为0的样本中,被错误地判断为1的比例。
def evaluateModel(model, validationData):
score = model.predict(validationData.map(lambda p: p.features))
scoreAndLabels=score.zip(validationData.map(lambda p: p.label))
metrics = BinaryClassificationMetrics(scoreAndLabels)
AUC=metrics.areaUnderROC
return( AUC)
参考:Python + Spark 2.0 +Hadoop 机器学习与大数据实战 ,林大贵

本文探讨了基于决策树的网页分类问题,利用Python和Spark的MLib库进行模型训练。数据预处理阶段忽略与分类无关的字段,模型训练时设置了决策树的相关参数。最后,通过AUC评估模型的性能。
&spm=1001.2101.3001.5002&articleId=79954633&d=1&t=3&u=7c0be33af84048ddbef3623f6d95a30a)
3314

被折叠的 条评论
为什么被折叠?



