使用 PySpark 进行机器学习
Andrew Collier
Data Scientist, Fathom Data
# 'type' 类别计数
+-------+-----+
| type|count|
+-------+-----+
|Midsize| 22|
| Small| 21|
|Compact| 16|
| Sporty| 14|
| Large| 11|
| Van| 9|
+-------+-----+
# 'type' 类别的数值索引
+-------+--------+
| type|type_idx|
+-------+--------+
|Midsize| 0.0|
| Small| 1.0|
|Compact| 2.0|
| Sporty| 3.0|
| Large| 4.0|
| Van| 5.0|
+-------+--------+
+-------+ +-------+-------+-------+-------+-------+-------+
| type| |Midsize| Small|Compact| Sporty| Large| Van|
+-------+ +-------+-------+-------+-------+-------+-------+
|Midsize| | X | | | | | |
| Small| | | X | | | | |
|Compact| ===> | | | X | | | |
| Sporty| | | | | X | | |
| Large| | | | | | X | |
| Van| | | | | | | X |
+-------+ +-------+-------+-------+-------+-------+-------+
每个类别水平变成一列。
+-------+ +-------+-------+-------+-------+-------+-------+
| type| |Midsize| Small|Compact| Sporty| Large| Van|
+-------+ +-------+-------+-------+-------+-------+-------+
|Midsize| | 1 | 0 | 0 | 0 | 0 | 0 |
| Small| | 0 | 1 | 0 | 0 | 0 | 0 |
|Compact| ===> | 0 | 0 | 1 | 0 | 0 | 0 |
| Sporty| | 0 | 0 | 0 | 1 | 0 | 0 |
| Large| | 0 | 0 | 0 | 0 | 1 | 0 |
| Van| | 0 | 0 | 0 | 0 | 0 | 1 |
+-------+ +-------+-------+-------+-------+-------+-------+
二元值表示对应水平的存在(1)或不存在(0)。
+-------+ +-------+-------+-------+-------+-------+-------+ +------+-----+
| type| |Midsize| Small|Compact| Sporty| Large| Van| |Column|Value|
+-------+ +-------+-------+-------+-------+-------+-------+ +------+-----+
|Midsize| | 1 | 0 | 0 | 0 | 0 | 0 | | 0| 1|
| Small| | 0 | 1 | 0 | 0 | 0 | 0 | | 1| 1|
|Compact| ===> | 0 | 0 | 1 | 0 | 0 | 0 | ===> | 2| 1|
| Sporty| | 0 | 0 | 0 | 1 | 0 | 0 | | 3| 1|
| Large| | 0 | 0 | 0 | 0 | 1 | 0 | | 4| 1|
| Van| | 0 | 0 | 0 | 0 | 0 | 1 | | 5| 1|
+-------+ +-------+-------+-------+-------+-------+-------+ +------+-----+
稀疏表示:仅存列索引与值。
+-------+ +-------+-------+-------+-------+-------+ +------+-----+
| type| |Midsize| Small|Compact| Sporty| Large| |Column|Value|
+-------+ +-------+-------+-------+-------+-------+ +------+-----+
|Midsize| | 1 | 0 | 0 | 0 | 0 | | 0| 1|
| Small| | 0 | 1 | 0 | 0 | 0 | | 1| 1|
|Compact| ===> | 0 | 0 | 1 | 0 | 0 | ===> | 2| 1|
| Sporty| | 0 | 0 | 0 | 1 | 0 | | 3| 1|
| Large| | 0 | 0 | 0 | 0 | 1 | | 4| 1|
| Van| | 0 | 0 | 0 | 0 | 0 | | | |
+-------+ +-------+-------+-------+-------+-------+ +------+-----+
水平互斥,可删除一列。
from pyspark.ml.feature import OneHotEncoder
onehot = OneHotEncoder(inputCols=['type_idx'], outputCols=['type_dummy'])
将编码器拟合到数据。
onehot = onehot.fit(cars)
# How many category levels?
onehot.categorySizes
[6]
cars = onehot.transform(cars)
cars.select('type', 'type_idx', 'type_dummy').distinct().sort('type_idx').show()
+-------+--------+-------------+
| type|type_idx| type_dummy|
+-------+--------+-------------+
|Midsize| 0.0|(5,[0],[1.0])|
| Small| 1.0|(5,[1],[1.0])|
|Compact| 2.0|(5,[2],[1.0])|
| Sporty| 3.0|(5,[3],[1.0])|
| Large| 4.0|(5,[4],[1.0])|
| Van| 5.0| (5,[],[])|
+-------+--------+-------------+
from pyspark.mllib.linalg import DenseVector, SparseVector
存储此向量:[1, 0, 0, 0, 0, 7, 0, 0]。
DenseVector([1, 0, 0, 0, 0, 7, 0, 0])
DenseVector([1.0, 0.0, 0.0, 0.0, 0.0, 7.0, 0.0, 0.0])
SparseVector(8, [0, 5], [1, 7])
SparseVector(8, {0: 1.0, 5: 7.0})
使用 PySpark 进行机器学习