字符串与因子
如您所知,Spark 在建模时需要数值数据。到目前为止这不是问题;即便是布尔列,也能轻松转换为整数。不过,您还将把航空公司和航班目的地作为模型的特征。它们是字符串类型,表面上没有直接的方法将其转换为数值类型。
好在 PySpark 在 pyspark.ml.features 子模块中内置了相应函数。您可以创建所谓的"独热向量"(one-hot vector)来表示每个航班的承运人和目的地。独热向量是一种表示分类特征的方法:每个观测值对应一个向量,除至多一个元素外,其余元素全为 0,而那个元素的取值为 1。
向量中的每个元素都对应该特征的一个水平(level)。因此,只要查看哪个元素等于 1,就能判断该观测属于哪个水平。
对分类特征进行编码的第一步是创建一个 StringIndexer。该类的成员是 Estimator,接受包含字符串列的 DataFrame,并将每个唯一字符串映射为一个数字。随后,该 Estimator 返回一个 Transformer,它会获取一个 DataFrame,将映射作为元数据附加其上,并返回一个新增了与原字符串列对应的数值列的新 DataFrame。
第二步是使用 OneHotEncoder 将这个数值列编码为独热向量。它的工作流程与 StringIndexer 相同:先创建 Estimator,再生成 Transformer。最终会得到一列向量,用于将您的分类特征编码成适合机器学习算法的形式!
这看起来可能有些复杂,但别担心!您只需要记住:创建一个 StringIndexer 和一个 OneHotEncoder,剩下的就交给 Pipeline。
为什么必须把分类特征编码为独热向量?
本练习是课程的一部分
