深入分析Microsoft Azure 机器学习工作室案例( 三 )


#特征列的集合(不包含income)feature_cols=[colforcolindataframe.columnsifcol!=label_col]forcolindataframe:print(col)print('----------------------------------')
#所有数字列numeric_cols=[colforcolindataframe.columnsifis_numeric_dtype(col)]forcolindataframe:print(str(col)+'typeis:'+str(dataframe[col].dtype))print('----------------------------------')
defparse_row(row):line=[]#vw样本的第一个元素 , 定义该样本的权重 , 这里因为就两个状态 , 所以定义1和-1line.append(f"{1ifrow[label_col]==true_labelelse-1}|")#添加样本的后续值forcolinfeature_cols:ifcolinnumeric_cols:#具有数字的值 , 格式为列名:值line.append(f"{col}:{row[col]}")else:#非数字的值 , 格式为列值line.append("".join((str(row[col])).split).replace("|","").replace(":",""))print(line)vw_line="".join(line)returnvw_line
vw=dataframe.apply(parse_row,axis=1).to_frame
输出样例
['-1|3977516Bachelors13Never-marriedNot-in-familyWhiteMale2174040']
['1|3184154Some-college10Married-civ-spouseHusbandWhiteMale0038']
▍SplitData节点
这个节点比较简单 , 按行将数据集分为50%和50% 。
▍TrainVowpalWabbitModel节点
这个节点就是将之前我们生成的vw数据集进行训练建模 , 需要关注的信息有VWarguments(VW参数):这个是VowpalWabbit可执行文件的命令行参数 , loss_function参数开关可选有:classic、expectile、hinge、logistic、poisson、quantile、squared , 默认时squared 。
这里选择的是--loss_functionlogistic
logistic回归由Cox在1958年提出 , 它的名字虽然叫回归 , 但其实这是一种二分类算法 , 并且是一种线性模型 。 由于是线性模型 , 因此在预测时计算简单 , 在某些大规模分类问题 , 如广告点击率预估(CTR)上得到了成功的应用 。 如果你的数据规模巨大 , 而且要求预测速度非常快 , 则非线性核的SVM、神经网络等非线性模型已经无法使用 , 此时logistic回归是你为数不多的选择 。 Specifyfiletype(指定文件类型):VW表示VowpalWabbit使用的内部格式 , SVMLight是其他一些机器学习工具使用的一种格式 。 显然我们应该选择VW 。 Outputreadablemodelfile(输出可读模型):选择True , 文件会保存在与输入文件相同的存储帐户和容器中Outputinvertedhashfile(输出反转哈希):选择True , 文件会保存在与输入文件相同的存储帐户和容器中
▍ScoreVowpalWabbitModel节点
ScoreVowpalWabbitModel和TrainVowpalWabbitModel差不多 , 差异的参数是
VWarguments(VW参数):link开关的参数可选有glf1、identity、logistic、poisson , 默认是identity 。
这里选择的是--linklogistic
▍ExecutePython节点
这个节点也是一段Python脚本 , 目的是添加一个评估列 , 这段脚本比较简单
关键代码#阈值设定 , 通过和结果概率比较 , 得到标签threshold=0.5#二分的结果标签binary_class_scored_col_name="BinaryClassScoredLabels"#二分的评估概率 , 这个值会被反映为标签binary_class_scored_prob_col_name="BinaryClassScoredProbabilities"output=dataframe.rename(columns={"Results":binary_class_scored_prob_col_name})output[binary_class_scored_col_name]=output[binary_class_scored_prob_col_name].apply(lambdax:1ifx>=thresholdelse-1)
▍EditMetadata节点
EditMetadata的核心是定义列的元数据 , 其有两个重要作用重新定义列的数据类型 , 但要注意的是数据集中的值和数据类型实际上并未更改;更改的是机器学习内部的元数据 , 它告诉下游组件如何使用该列 。 比如把一个数字列重新定义为分类值 , 告诉机器学习将重新看待这个数据列 。 指示哪一列包含类标签 , 或者要分类或预测的值 。 这个功能比较重要 , 可以帮助机器学习了解哪一列的的训练含义 。
所以这次我们需要对Labels做定义 , 不改变数据类型 , 但将训练含义定义为Labels类型 。 这个描述有点绕 , 我们应该这么说:将一个名为Labels的列定义为标签(Labels)类型