导航

入门文章学习(二)- 代码学习

Posted on 2021-05-06 20:34  空格已敲小明快跑鸭  阅读(131)  评论(0)    收藏  举报

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')