第1关:Iris 分类
任务描述
本关任务:使用 pyspark ml
的LogisticRegression
分类器完成 Iris
分类任务。
# -*- coding: utf-8 -*-
from pyspark.sql import SparkSession
from sklearn.datasets import load_iris
import pandas
from pyspark.ml.classification import LogisticRegression
from pyspark.mllib.evaluation import BinaryClassificationMetrics
from pyspark.ml.feature import RFormula
# 训练模型
def trainingModel(spark):
# ********** Begin ********** #
# 1.加载sklearn的训练数据
iris = load_iris()
# 2.特征矩阵
features = pandas.DataFrame(iris.data, columns = iris.feature_names)
# 3.目标矩阵
targets = pandas.DataFrame(iris.target, columns = ['Species'])
# 4.合并矩阵
merged = pandas.concat([features, targets], axis = 1)
# 5.创建spark DataFrame
raw_df = spark.createDataFrame(merged)
# 6.提取特征与目标
fomula = RFormula(formula = 'Species ~ .')
raw_df = fomula.fit(raw_df).transform(raw_df)
# 7.拆分训练集和测试集
train_df, test_df = raw_df.randomSplit([0.8, 0.2])
# 8.创建LR分类器
lr = LogisticRegression(family = "multinomial")
# 9.训练
model = lr.fit(train_df)
# 10.返回(模型、测试集)
return (model, test_df)
# ********** End ********** #
第2关:图片识别 - 坦克类型分类
任务描述
本关任务:使用 pyspark ml
的LogisticRegression
分类器完成 坦克类型分类任务。
import cv2
import os
import pandas as pd
from pyspark.mllib.evaluation import BinaryClassificationMetrics
from pyspark.sql import SparkSession
from pyspark.ml.linalg import Vectors
from pyspark.ml.classification import LogisticRegression, NaiveBayes, LinearSVC
from pyspark.ml.regression import LinearRegression
# 获取目录的所有文件,返回图片路径列表
def get_file_path(root_path):
# ********** Begin ********** #
file_list = []
dir_or_files = os.listdir(root_path)
for dir_file in dir_or_files:
dir_file_path = os.path.join(root_path, dir_file)
file_list.append(dir_file_path)
return file_list
# ********** End ********** #
# 提取图片特征并将其转换成向量,返回特征向量
def img2vector(imgfilename):
# ********** Begin ********** #
img = cv2.imread(imgfilename, cv2.IMREAD_GRAYSCALE)
rows, columns = img.shape
img = img.reshape(rows * columns)
return Vectors.dense(img)
# ********** End ********** #
# 训练模型,返回元组(测试集,模型)
def trainingModel(spark,root_path):
datas = []
# ********** Begin ********** #
# 1. 获取 root_path 下的所有图片文件
fileList = get_file_path(root_path)
# 2.1 遍历图片文件列表,根据文件名给数据打标签
"""
如果文件名包含 `btr-70` ,label 设置为 0
如果文件名包含 `t-72` ,label 设置为 1
其他的,label 设置为 2
"""
# 2.2 调用img2vector函数,提取图片特征并将其转换成向量
# 2.3 将向量与标签(label)构建成元组并存储到 datas 列表中
for x in fileList:
vector = img2vector(x)
if "btr-70" in x:
label = 0
elif "t-72" in x:
label = 1
else:
label = 2
datas.append((vector, label))
# 3. 利用 pandas 将 datas 转换成 DataFrame 并将包含向量的列的列名设置为 features,包含标签(label) 的列的列名设置为 label
df = pd.DataFrame(datas, columns=['features', 'label'])
# 4. 使用 spark 加载 pandas 转换后的数据集
sparkDF = spark.createDataFrame(df)
# 5. 将数据集拆分训练集和测试集
train_df, test_df = sparkDF.randomSplit([0.7, 0.3])
# 6. 创建LR分类器
lr = LogisticRegression(family="multinomial")
# 7. 训练模型
model = lr.fit(train_df)
# 8.返回元组(测试集,模型)
return (test_df,model)
# ********** End ********** #