|
|
|
@ -1,23 +1,30 @@
|
|
|
|
|
|
|
|
|
|
## 5.1 Spark机器学习 - 坦克卫星图片识别分类
|
|
|
|
|
## 5.2 Spark机器学习 - 坦克卫星图片识别分类
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 5.1.1 数据集介绍
|
|
|
|
|
### 5.2.1 数据集介绍
|
|
|
|
|
|
|
|
|
|
三种坦克图片数据集,如下图所示:
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
<p align="center" >
|
|
|
|
|
<img style="border: 2px solid #ddd;padding: 5px; background: #fff;" src="https://www.educoder.net/api/attachments/458868" alt="" height="60%" width="60%" />
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
<p align="center" >
|
|
|
|
|
<img style="border: 2px solid #ddd;padding: 5px; background: #fff;" src="https://www.educoder.net/api/attachments/458870" alt="" height="60%" width="60%" />
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<p align="center" >
|
|
|
|
|
<img style="border: 2px solid #ddd;padding: 5px; background: #fff;" src="https://www.educoder.net/api/attachments/458871" alt="" height="60%" width="60%" />
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
以上有三种数据集,分别是以`bmp-2`开头的`BMP-2`步兵战车的图片、以`btr-70`开头的`BTR-70`装甲输送车的图片、以`t-72`开头的`T-72`主战坦克的图片。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### 5.1.2 数据集处理
|
|
|
|
|
#### 5.2.2 数据集处理
|
|
|
|
|
|
|
|
|
|
##### 5.1.2.1 加载图片数据集
|
|
|
|
|
##### 5.2.2.1 加载图片数据集
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
我们可以使用`opencv_python`计算机视觉库来读取一幅图像。
|
|
|
|
@ -38,7 +45,7 @@ img = img.reshape(rows*columns)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
##### 5.1.2.2 将一维数组转换成 Spark 中的向量
|
|
|
|
|
##### 5.2.2.2 将一维数组转换成 Spark 中的向量
|
|
|
|
|
|
|
|
|
|
上一步我们将图片转换成一维的数组之后了,接下来我们将一维数组转换成 Spark 中的向量。
|
|
|
|
|
|
|
|
|
@ -93,7 +100,7 @@ print(type(img))
|
|
|
|
|
|
|
|
|
|
一般我们会直接将数组转换成稠密向量。
|
|
|
|
|
|
|
|
|
|
##### 5.1.2.3 将向量与标签进行绑定并将其转换成Dataframe
|
|
|
|
|
##### 5.2.2.3 将向量与标签进行绑定并将其转换成Dataframe
|
|
|
|
|
|
|
|
|
|
上面的两步,我们已经加载了图片数据并将其转换成`Spark`中的向量了,但是这样还远远不够,为什么呢?
|
|
|
|
|
|
|
|
|
@ -140,7 +147,7 @@ print(type(img))
|
|
|
|
|
通过`pandas`构建了 `Dataframe`之后指定了列名这样做的话,就可以不用设置`featuresCol`、`labelCol`了,同时增强了代码可读性。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### 5.1.3 Spark 加载数据集
|
|
|
|
|
#### 5.2.3 Spark 加载数据集
|
|
|
|
|
|
|
|
|
|
上面我们已经把数据集处理完毕之后,然后我们可以通过`Spark`来加载数据集。
|
|
|
|
|
|
|
|
|
@ -150,7 +157,7 @@ sparkDF = spark.createDataFrame(df) # df是我们通过pandas构建的Dataframe
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### 5.1.4 将数据集拆分训练集和测试集
|
|
|
|
|
#### 5.2.4 将数据集拆分训练集和测试集
|
|
|
|
|
|
|
|
|
|
上面我们把图片数据集加载到`Spark`中了,之后我们要把数据集划分成两部分,一部分为训练集,另一部分为测试集。
|
|
|
|
|
|
|
|
|
@ -163,7 +170,7 @@ train_df, test_df = sparkDF.randomSplit([0.7, 0.3])
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### 5.1.5 创建LR分类器
|
|
|
|
|
#### 5.2.5 创建LR分类器
|
|
|
|
|
|
|
|
|
|
逻辑回归是一种用于预测分类响应的流行方法。这是广义线性模型的一种特殊情况,可以预测结果的可能性。在`spark.ml`逻辑回归中,可以通过使用二项式逻辑回归来预测二进制结果,或者在使用多项式逻辑回归时可以将其预测为多类结果。使用该`family` 参数在这两种算法之间进行选择,或者将其保留为未设置状态,`Spark`会推断出正确的变体。
|
|
|
|
|
|
|
|
|
@ -178,7 +185,7 @@ train_df, test_df = sparkDF.randomSplit([0.7, 0.3])
|
|
|
|
|
lr = LogisticRegression(family="multinomial")
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### 5.1.6 训练模型
|
|
|
|
|
#### 5.2.6 训练模型
|
|
|
|
|
|
|
|
|
|
上一步,我们已经把`LR`分类器构建好了并且我们把数据集划分成训练集与测试集了,接下来我们就是训练模型了。
|
|
|
|
|
|
|
|
|
@ -186,7 +193,7 @@ lr = LogisticRegression(family="multinomial")
|
|
|
|
|
model = lr.fit(train_df)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### 5.1.7 评估模型
|
|
|
|
|
#### 5.2.7 评估模型
|
|
|
|
|
|
|
|
|
|
我们已经把模型训练好了,接下来就是评估模型了。
|
|
|
|
|
|