Abstract: 参照入门学习路径学习了两个代码示例,对比我们项目的代码做了笔记。
链接:
https://zhuanlan.zhihu.com/p/52753778
https://github.com/apache/spark/blob/master/examples/src/main/scala/org/apache/spark/examples/ml/RandomForestClassifierExample.scala#L47
(1)导入数据
1 from pyspark.sql import SparkSession 2 from pyspark import conf 3 4 conf = (conf.set("deploy-mode","client") 5 .setAll([('spark.executor.memory', '8g'), 6 ("spark.num.executors","6"), 7 ('spark.executor.cores', '3'), 8 ('spark.cores.max', '3'), 9 ("spark.driver.memory","20g"), 10 ("spark.driver.cores","4")]) 11 12 spark = SparkSession\ 13 .builder.master("local[*]")\ 14 .config(conf=conf)\ 15 .appName("Train_rf")\ 16 .getOrCreate() 17 18 train = spark.read.options(header='true').csv('./BlackFriday/train.csv', header=True, inferSchema=True)
文档链接:
https://spark.apache.org/docs/2.1.0/api/python/pyspark.sql.html?highlight=sparksession
pyspark.sql module: 涵盖一些Saprk SQL 和 DataFrame的重要类。有DataFrame的创建,相关函数。
(2) 分析数据的类型
1 train.printSchema()
查看DataFrame中列的类型。
(3) 预览数据集
1 train.head(5)
(4) 插补缺失值
train.na.drop('any').count() 统计并删除所有包含空值的行train = train.fillna(-1) 填充train的null值
(5) 分析数值特征
train.describe().show()
train.select('User_ID','Age').show(5)
(6) 分析categorical特征
为了建立一个模型,我们需要观察数据中分类特征的分布。查看某分类特征中不同类别的数量:
train.select('Product_ID').distinct().count()
统计train和test中不同类别的情况:diff_cat_in_train_test=test.select('Product_ID').subtract(train.select('Product_ID'))
diff_cat_in_train_test.distinct().count()
diff_cat_in_train_test.distinct().show(5)
(7) 将分类变量转换为标签
应用”StringIndexer“把分类列转换为标签,该转换把标签列编码为标签索引的列。
1 from pyspark.ml.feature import StringIndexer 2 3 plan_indexer = StringIndexer(inputCol = 'Product_ID', outputCol = 'product_id_trans') 4 labeller = plan_indexer.fit(train)
用fit()方法将StringIndexer应用在train的数据框架上,构建了labeller。
然后,可以使用labeller,调用transform的方法,来转换"train"和"test"两个DataFrame。
1 Train1 = labeller.transform(train) 2 Test1 = labeller.transform(test) 3 4 Train1.show(2) 5 Train1.select('product_id_trans').show(2)
(8) 选择特征来构建机器学习模型
从pyspark.ml.feature里导入RFormula。然后在这个公式里指定依赖和独立的列。同时为features和label列制定名称。
1 from pyspark.ml.feature import RFormula 2 3 formula = RFormula(formula="Purchase ~ Age+ Occupation +City_Category+Stay_In_Current_City_Years+Product_Category_1+Product_Category_2+ Gender", featuresCol="features",labelCol="label")
Purchase是依赖列;后面的a+b+c...是独立列们。
创建公式后,把公式应用到数据上:
1 t1 = formula.fit(Train1) 2 train1 = t1.transform(Train1) 3 test1 = t1.transform(Test1) 4 train1.show(2)
在应用了这个公式之后,我们可以看到有两个额外的列,称为features和label(右滑!),并对我们在公式中指定的列进行标记(featuresCol= features和labelCol= label)。
""" +-------+----------+------+----+----------+-------------+--------------------------+--------------+------------------+------------------+------------------+--------+----------------+--------------------+-------+ |User_ID|Product_ID|Gender| Age|Occupation|City_Category|Stay_In_Current_City_Years|Marital_Status|Product_Category_1|Product_Category_2|Product_Category_3|Purchase|product_id_trans| features| label| +-------+----------+------+----+----------+-------------+--------------------------+--------------+------------------+------------------+------------------+--------+----------------+--------------------+-------+ |1000001| P00069042| F|0-17| 10| A| 2| 0| 3| -1| -1| 8370| 766.0|(16,[6,10,13,14],...| 8370.0| |1000001| P00248942| F|0-17| 10| A| 2| 0| 1| 6| 14| 15200| 183.0|(16,[6,10,13,14],...|15200.0| +-------+----------+------+----+----------+-------------+--------------------------+--------------+------------------+------------------+------------------+--------+----------------+--------------------+-------+ only showing top 2 rows """
直观上,数据里features列中的所有分类变量都被转换为数值,数值变量与之前应用ML时相同。
train1.select('features').show(2) """ +--------------------+ | features| +--------------------+ |(16,[6,10,13,14],...| |(16,[6,10,13,14],...| +--------------------+ only showing top 2 rows
(9) 建立机器学习模型
在应用RFormula和转换Dataframe之后,我们现在需要根据这些数据开发机器学习模型。我想为这个任务应用一个随机森林回归。
在创建一个模型rf之后,我们需要将train1数据划分为train_cv和test_cv进行交叉验证。这里,我们将train1数据区域划分为train_cv的70%和test_cv的30%。
在train_cv上建立模型,在test_cv上进行预测。结果将保存在predictions中。
1 from pyspark.ml.regression import RandomForestRegressor 2 rf = RandomForestRegressor() 3 4 (train_cv, test_cv) = train1.randomSplit([0.7, 0.3]) 5 6 model1 = rf.fit(train_cv) 7 predictions = model1.transform(test_cv)
(10) 模型效果评估
为了评估模型,我们需要从pyspark.ml.evaluation中导入RegressionEvaluator。我们必须为此创建一个对象。有一种方法叫 evaluate for evaluator ,它对模型求值。我们需要为此指定度量标准。
1 from pyspark.ml.evaluation import RegressionEvaluator 2 evaluator = RegressionEvaluator() 3 mse = evaluator.evaluate(predictions,{evaluator.metricName:"mse" })
现在,我们将在所有的train1数据集上再次训练一个模型。
1 model = rf.fit(train1) 2 predictions1 = model.transform(test1)
预测之后,我们得到测试集预测结果,并将这个新的dataframe保存成csv文件。
df = predictions1.selectExpr("User_ID as User_ID", "Product_ID as Product_ID", 'prediction as Purchase') df.toPandas().to_csv('./BlackFriday/submission.csv')
浙公网安备 33010602011771号