乳腺癌诊断数据是加州大学机器学习和智能系统中心公布在其网站上众多数据集中的一个。用于机器学习研究者做分类练习或者是回归算法研究的样本数据,数据集包含569例乳腺肿瘤组织细胞的电子图像数据,每一图像有32个变量,1个变量是id编号,1个是人工标注的分类标签(良性or恶性),剩余30个变量都是描述电子图像的各种特征,也就是features。这些特征变量描述了细胞核的各种特点,比如半径,对称性,面积等,数据集无缺失值。利用这30个特征变量构建机器学习模型,可以对肿瘤细胞的性质进行预测。在本案例中我们使用FEA-spk和FEA来进行机器学习案例实现。
1. 数据的下载
数据的下载地址为
https://pan.baidu.com/s/1pLp7qER 密码:zdcn
关于具体字段的说明这里就不再介绍了,数据的格式如下图所示
2. 神经网络的基本结构
我们首先把输入层的特征变量先乘以权重后求和加上一个偏置项,通过一个激活函数进行非线性转换,将这些非线性变换的结果再次作为输入层,以同样的方法再次进入下一个隐藏层,直到最后的输出层,该过程称为前向传播。再利用后向传播算法和梯度下降更新权重,不断最小化损失函数,直至得到最优解(或者局部最优解)。
神经网络算法在深度学习领域有很重要的应用,比如CNN,RNN。
3. FEA-spk可调的神经网络参数和FEA可调的神经网络参数
(1) FEA-spk可以调节的参数
featuresCol:输入数据 DataFrame 中指标特征列的名称。
labelCol:输入数据 DataFrame 中标签列的名称。
layers:这个参数是一个整型数组类型,第一个元素需要和特征向量的维度相等,最后一个元素需要训练数据的标签取值个数相等,如 2 分类问题就写 2。中间的元素有多少个就代表神经网络有多少个隐层,元素的取值代表了该层的神经元的个数。
例如layers = [100,6,5,2]。
maxIter:优化算法求解的最大迭代次数。默认值是 100。
predictionCol:预测结果的列名称。
tol:优化算法迭代求解过程的收敛阀值。默认值是 1e-4。不能为负数。
blockSize:该参数被前馈网络训练器用来将训练样本数据的每个分区都按照 blockSize 大小分成不同组,并且每个组内的每个样本都会被叠加成一个向量,以便于在各种优化算法间传递。该参数的推荐值是 10-1000,默认值是 128。
(2) FEA可以调节的参数
hidden_layer_sizes
隐藏层层数和每层神经元个数设置,默认值为(100,),设置为(5,3)表示有两层隐藏层,一个隐藏层有5个神经元,第二个隐藏层3个神经元。
activation
有四种激活函数可以选择{'identity','logistic','tanh','relu'},默认是relu激活函数,一般都使用relu
solver
solver是通过不断寻找损失函数最优解来进行权重迭代更新的优化器,有三种可以选择 {'lbfgs','sgd', 'adam'},默认设置是"adam","lbfgs" 是拟牛顿法的一种,'sgd' 是随机梯度下降法,'adam'是基于随机梯度下降的另一种优化算法,adam在大规模训练集上表现优秀(相对来说能够节省训练时间和提高validation score),lbfgs在小规模训练集上效果更好,收敛更快。
alpha
正则化参数. alpha是进行L2惩罚项的参数。默认值为0.0001。
batch_size
批尺寸,一般对随机优化方法都需要批尺寸这个参数,默认为min(200, n_samples),即200和训练集样本量两者之间的最小值,当然如果solver 选择了lbfgs的话,就没有必要使用批尺寸了。
learning_rate
学习率,有三个选项可供选择 {’constant', 'invscaling','adaptive'},
'constant’表示设置学习率为常数,全程不变,'invscaling’ 则会逐渐减小学习率,'adaptive'会依据损失函数的值来调整学习率
learning_rate_init
学习率初始值设置为0.001,该设置只有在solver为sgd或者adam时候才有效。
max_iter
最大迭代次数,默认值是200,对于随机优化器来说(sgd和adam), 如果迭代过程中出现了tol定义的收敛或者是到达最大迭代次数,训练就会停止。
random_state
是否设置随机种子,默认值为None。
tol
优化阈值,默认值为0.0001,连续两次迭代如果损失函数的值没有降低一个tol或者分数没有提高一个tol,就认为已经收敛,训练进程就会停止,除非学习率设置为adaptive。
4. 使用FEA-spk的具体实现步骤如下
创建spk连接
spk=@udf df0@sys by spk.open_spark
数据准备
#加载数据
df1=@udf spk by spk.load_csv with (header,/data/data.csv)
#将标签列转化为数字
df2=@udf df1 by spk.ML_si with
(inputCol="diagnosis", outputCol="label")
#删除经过我们简单分析得到的无用列
df3=@udf df2 by spk.df_drop_col with (id,diagnosis,_c32)
#我们将所有的列转化为double类型的
df3=@udf df3 by spk.ML_double
#我们将要用到的特征聚合为向量,其中最后一列是标签,其余的是特征
df4=@udf df3 by spk.ML_va
#选择特征向量,标签列
df4=@udf df4 by spk.loc with (features,label)
#查看数据
a=@udf df4 by spk.ML_MDF
dump a
#将数据划分为训练集和测试集, 其中df4表示需要划分的数据,10.0,1,0分别是训练集和测试集对应的比例,df5表示划分好的训练集,df6表示划分好的测试集
df5,df6=@udf df4 by spk.tt_split with (10.0,1.0)
选择算法
有了特征数据和标记数据,接下来我们就要选择算法了,这里我们选择神经网络模型
训练模型
#对训练集神经网络分类器模型,构建神经网络模型,最大迭代次数是2000,一共有4层,输入层特征向量的维度是30,中间2层是隐藏层神经元的个数, 输出对应2个类
mlpc= @udf df5 by spk.ML_mlpc with (maxIter=2000,
layers=[30, 10, 10, 2], blockSize=128, seed=1234)
模型打分
#对建立好的神经网络模型进行打分,其中df5表为训练集,mlpc为训练的模型,jf为当前的工作区
score=@udf df5 by spk.ML_score with (mlpc@jf)
#查看评分
dump score
模型的准确率达到了91%
机器预测
#我们首先对测试集进行拆分,拆分为特征列和标签列
df7=@udf df6 by spk.loc with (features)
df8=@udf df6 by spk.loc with (label)
#对特征列进行预测乳腺肿瘤性质, 其中df7表为不带标签的测试集
predict=@udf df7 by spk.ML_predict with (mlpc@jf)
#查看预测的结果
aa=@udf predict by spk.ML_MDF
dump aa
其中prediction列就是预测的结果,0代表是良性,1代表是恶性
综合评估
#对预测的结果和模型进行综合评估,这里我们用精确率和召回率指标
#精确率的计算, 其中predict表为预测的结果表,df8为包含真实标签的表,weightedPrecision表示精度
pp=@udf spk,predict,df8 by spk.ML_evaluate
with (weightedPrecision)
#查看结果
dump pp
我们可以看到,精确率达到了89%
召回率的计算, 其中predict表为预测的结果表,df8为包含真实标签的表,weightedRecall表示召回率
tt=@udf spk,predict,df8 by spk.ML_evaluate with (weightedRecall)
#查看结果
dump tt
我们可以看到,在测试集上面召回率达到了87%
5. 使用FEA实现的具体步骤如下
数据准备
#加载数据
df1=load csv by data.csv
#把label也就是人工诊断的结果diagnosis提取出来
df3= loc df1 by diagnosis
#将lable值转化为数字。注意:M表示恶性,B表示良性
df3.diagnosis = lambda diagnosis by (x:1 if x=='M' else 0)
#对特征进行提取,选择第2列到第31列作为特征
df2= @udf df1 by ML.iloc with (:,2:32)
#将特征表和标签表进行训练集和测试集的划分
result = @udf df2,df3 by ML.tts with (0.2,2016,jf)
其中df2为特征表,df3为标签表,0.3表示测试集所占的百分比,2016是随机因子,jf表示划分后,新的训练集和测试集的DF表所在的工作区。result表保存概要信息的DF表,包含划分后的新训练集和测试集数据对应的DF表名称。result表的格式如下图所示
划分后的表名就是result表中的表名
选择算法
有了特征数据和标记数据,接下来我们就要选择算法了,这里我们FEA选择神经网络模型
训练模型
#对训练集尝试建立神经网络分类模型
mlpc= @udf X0,Y0 by ML.mlpc with (activation="relu",batch_size=80,
hidden_layer_sizes=(30,30,30,15,55,15,15,30),max_iter=2000,
random_state=42,learning_rate_init=0.001)
构建神经网络模型,X0为训练集特征表,Y0为训练集标签表
激活函数是relu函数,批尺寸是80,hidden_layer_sizes是隐藏层层数和每层神经元个数,最大迭代次数是2000,随机种子设置为42,学习率初始值设置为0.001
模型打分
#对神经网络模型进行打分,X0是特征训练集,Y0是标签训练集
mlpc_score = @udf X0,Y0 by ML.score with (mlpc@jf)
#查看结果
dump mlpc_score
可以看到,模型的准确度达到了92%
机器预测
#对测试集的特征使用训练好的神经网络模型进行预测, X1是测试集特征数据mlpc是神经网络模型,jf是模型所在的工作区,predict是预测的结果
predict = @udf X1 by ML.predict with (mlpc@jf)
#查看预测结果
dump predict
其中1代表是恶性,0代表是良性
综合评估
#对测试集进行模型评估,看看模型在测试集上面的效果如何,这里我们使用ROC面积和f1来衡量
#ROC曲线面积, Y1是测试集真实的标签,predict为预测的结果,roc_score是ROC曲线下面的面积对应的df表
roc_score=@udf Y1,predict by ML.roc_score
#查看结果
dump roc_score
可以看到ROC曲线的面积是0.9,还是挺不错的
#f1的计算, Y1是测试集真实的标签,predict为预测的结果,f1_score是f1的计算值
f1_score=@udf Y1,predict by ML.f1_score
#查看结果
dump f1_score
可以看到,f1的指标也将近达到了90%
上面我们介绍了使用FEA和FEA-spk来进行机器学习的案例分析,我们可以看到,大致的处理流程是一致的,而FEA-spk是基于大规模分布式的机器学习,当数据量达到一定级别之后,FEA-spk的优势才会体现出来。
领取专属 10元无门槛券
私享最新 技术干货