机器学习测试笔记(12)——线性回归方法(下)

本文涉及的产品
性能测试 PTS,5000VUM额度
简介: 机器学习测试笔记(12)——线性回归方法(下)

3.逻辑回归



大家都知道符号函数:

f(x)=0       (x=0)

   =-1      (x<0)

     =1       (x>1)

下面这个函数是符号函数的一个变种:

g(x) =0.5    (x=0)

      =0       (x<0)

      =1       (x>1)


函数

image.png

正好符合这个函数与这个函数相吻合,且他是一个连续函数.函数曲线如下:

image.png


我们把这个函数叫做逻辑函数,由y=wx,我们令z= wx,

image.png


这样当y=0, g(x)’=0.5; y>0, g(x)’>0.5且趋于1y<0, g(x)’<0.5且趋于0,从而达到二分类的目的。sklearn.linear_model通过LogisticRegression类实现逻辑回归。


from sklearn.linear_model import LogisticRegression
#对sklearn数据进行分析
def useing_sklearn_datasets_for_LogisticRegression():
        # 读取和划分数据
        cancer =  datasets.load_breast_cancer()
        X = cancer.data
        y = cancer.target
        print("X的shape={},正样本数:{},负样本数:{}".format(X.shape, y[y  == 1].shape[0], y[y == 0].shape[0]))
        X_train, X_test,  y_train, y_test = train_test_split(X, y, test_size=0.2)
        # 训练模型
        model =  LogisticRegression()
        model.fit(X_train,  y_train)
        # 查看模型得分
        train_score =  model.score(X_train, y_train)
        test_score =  model.score(X_test, y_test)
        print("乳腺癌训练集得分:{trs:.2f},乳腺癌测试集得分:{tss:.2f}".format(trs=train_score,  tss=test_score))


输出

X的shape=(569,  30),正样本数:357,负样本数:212
乳腺癌训练集得分:0.95,乳腺癌测试集得分:0.95


这个结果还是非常满意的。


4.岭回归



岭回归(英文名:Ridgeregression, Tikhonov regularization)是一种专用于共线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价获得回归系数更为符合实际、更可靠的回归方法,对病态数据的拟合要强于最小二乘法。岭回归通过牺牲训练集得分,获得测试集得分。采用Ridge函数实现


from sklearn.linear_model import Ridge
#岭回归进行分析
def useing_sklearn_datasets_for_Ridge():
       X,y =  datasets.load_diabetes().data,datasets.load_diabetes().target
       X_train,X_test,y_train,y_test  = train_test_split(X, y, random_state=8,test_size=0.3)
       lr =  LinearRegression().fit(X_train,y_train)
       ridge =  Ridge().fit(X_train,y_train)
       print('alpha=1,糖尿病训练集得分:  {:.2f}'.format(ridge.score(X_train,y_train)))
       print('alpha=1,糖尿病测试集得分:  {:.2f}'.format(ridge.score(X_test,y_test)))
       ridge10 =  Ridge(alpha=10).fit(X_train,y_train)
       print('alpha=10,糖尿病训练集得分:  {:.2f}'.format(ridge10.score(X_train,y_train)))
       print('alpha=10,糖尿病测试集得分:  {:.2f}'.format(ridge10.score(X_test,y_test)))
       ridge01 =  Ridge(alpha=0.1).fit(X_train,y_train)
       print('alpha=0.1,糖尿病训练集得分:  {:.2f}'.format(ridge01.score(X_train,y_train)))
       print('alpha=0.1,糖尿病测试集得分:  {:.2f}'.format(ridge01.score(X_test,y_test)))


输出

alpha=1,糖尿病训练集得分: 0.43
alpha=1,糖尿病测试集得分: 0.43
alpha=10,糖尿病训练集得分: 0.14
alpha=10,糖尿病测试集得分: 0.16
alpha=0.1,糖尿病训练集得分: 0.52
alpha=0.1,糖尿病测试集得分: 0.47


通过下表分析一下各个alpha下训练集和测试集下的得分。


alpha

训练集得分

测试集得分

1

0.43

0.43

10

0.14

0.16

0.1

0.52

0.47

线性回归

0.54

0.45



plt.plot(ridge.coef_,'s',label='Ridge alpha=1')
plt.plot(ridge10.coef_,'^',label='Ridge alpha=10')
plt.plot(ridge01.coef_,'v',label='Ridge alpha=0.1')
plt.plot(lr.coef_,'o',label='Linear Regression')
plt.xlabel('coefficient index')
plt.ylabel('coefficient magnitude')
plt.hlines(0,0,len(lr.coef_))
plt.show()

image.png


  • alpha =10 0区间变化(^ 橘黄色上箭头)
  • alpha =1 变化变大(s 蓝色方块)
  • alpha = 0.1变化更大,接近线性(v 绿色下箭头)
  • 线性:变化超大,超出图(o 红色圆点)

alpha越大,收敛性越好


from sklearn.model_selection import learning_curve,KFold
#定义一个绘制学习曲线的函数
def plot_learning_curve(est, X, y):#learning_curve:学习曲线
tarining_set_size,train_scores,test_scores = learning_curve(
                 est,X,y,train_sizes=np.linspace(.1,1,20),cv=KFold(20,shuffle=True,random_state=1))
estimator_name = est.__class__.__name__
line =  plt.plot(tarining_set_size,train_scores.mean(axis=1),'--',label="training"+estimator_name)
plt.plot(tarining_set_size,test_scores.mean(axis=1),'-',label="test"+estimator_name,c=line[0].get_color())
plt.xlabel('training set size')
plt.ylabel('Score')
plt.ylim(0,1.1)


 plot_learning_curve(Ridge(alpha=1),  X,y)
     plot_learning_curve(LinearRegression(), X,y)
     plt.legend(loc=(0,1.05),ncol=2,fontsize=11)
    plt.show()


以上结果说明:

  1. 训练集得分比测试集得分要高;
  2. 岭回归测试集得分比线性回归测试集得分要低;
  3. 岭回归测试集得分与训练集得分差不多;
  4. 训练集小的时候,线性模型都学不到什么东西;
  5. 训练集加大,两个得分相同。


5.套索回归


套索回归(英文名Lasso Regression)略同于岭回归。在实践中,岭回归与套索回归首先岭回归。但是,如果特征特别多,某些特征更重要,具有选择性,那就选择Lasso可能更好。采用Lasso函数实现。

from sklearn.linear_model import Lasso
#对套索回归进行分析
def useing_sklearn_datasets_for_Lasso():
       X,y = datasets.load_diabetes().data,datasets.load_diabetes().target
       X_train,X_test,y_train,y_test  = train_test_split(X, y, random_state=8,test_size=0.3)
       lasso01 =  Lasso().fit(X_train,y_train)
       print('alpha=1,糖尿病训练集得分: {:.2f}'.format(lasso01.score(X_train,y_train)))
       print('alpha=1,糖尿病测试集得分:  {:.2f}'.format(lasso01.score(X_test,y_test)))
       print('alpha=1,套索回归特征数:  {}'.format(np.sum(lasso01.coef_!=0)))
       lasso01 =  Lasso(alpha=0.1,max_iter=100000).fit(X_train,y_train)
       print('alpha=0.1,max_iter=100000,糖尿病训练集得分:  {:.2f}'.format(lasso01.score(X_train,y_train)))
       print('alpha=0.1,max_iter=100000,糖尿病测试集得分:  {:.2f}'.format(lasso01.score(X_test,y_test)))
       print('alpha=1,套索回归特征数:  {}'.format(np.sum(lasso01.coef_!=0)))
       lasso01 = Lasso(alpha=0.0001,max_iter=100000).fit(X_train,y_train)
       print('alpha=0.0001,max_iter=100000,糖尿病训练集得分:  {:.2f}'.format(lasso01.score(X_train,y_train)))
       print('alpha=0.0001,max_iter=100000,糖尿病测试集得分:  {:.2f}'.format(lasso01.score(X_test,y_test)))
       print('alpha=1,套索回归特征数:  {}'.format(np.sum(lasso01.coef_!=0)))


输出

alpha=1,糖尿病训练集得分: 0.37
alpha=1,糖尿病测试集得分: 0.38
alpha=1,套索回归特征数: 3
alpha=0.1,max_iter=100000,糖尿病训练集得分: 0.52
alpha=0.1,max_iter=100000,糖尿病测试集得分: 0.48
alpha=1,套索回归特征数: 7
alpha=0.0001,max_iter=100000,糖尿病训练集得分: 0.53
alpha=0.0001,max_iter=100000,糖尿病测试集得分: 0.45
alpha=1,套索回归特征数: 10


alpha=1,特征数为3,得分低,出现欠拟合

  • alpha=0.1,降低alpha值可以加大得分,特征数提高到7
  • alpha=0.01,测试集得分: 0.45的测试集得分: 0.48,说明降低alpha值让模型。更倾向于出现过拟合现象。


比较岭回归与套索回归

def Ridge_VS_Lasso():
       X,y =  datasets.load_diabetes().data,datasets.load_diabetes().target
       X_train,X_test,y_train,y_test  = train_test_split(X, y, random_state=8,test_size=0.3)
       lasso =  Lasso(alpha=1,max_iter=100000).fit(X_train,y_train)
       plt.plot(lasso.coef_,'s',label='lasso  alpha=1')
       lasso01 = Lasso(alpha=0.  1,max_iter=100000).fit(X_train,y_train)
       plt.plot(lasso01.coef_,'^',label='lasso  alpha=0. 1')
       lasso0001 =  Lasso(alpha=0.0001,max_iter=100000).fit(X_train,y_train)
       plt.plot(lasso0001.coef_,'v',label='lasso  alpha=0.001')
       ridge01 = Ridge(alpha=0.1).fit(X_train,y_train)
       plt.plot(ridge01.coef_,'o',label='ridge01  alpha=0.1')
       plt.legend(ncol=2,loc=(0,1.05))
       plt.ylim(-1000,750)
       plt.xlabel('Coefficient  index')
       plt.ylabel("Coefficient  magnitude")
       plt.show()

image.png


以上结果说明:

  • alpha=1,大部分系数都在0附近
  • alpha=0.1,大部分系数都在0附近,但是比=1时少很多,有些不等于1
  • alpha=0.001,整个模型被正则化,大部分不等于0
  • alpha=0.1的岭回归与套索回归基本一致。

数据特征比较多,并且有一小部分真正重要,用套索回归,否则用岭回归。数据和方法。


6.  sklearn数据测试所有线性模型


建立文件machinelearn_data_model.py


# coding:utf-8
import numpy as np
import matplotlib.pyplot  as plt
from sklearn.linear_model  import LinearRegression
from sklearn.linear_model  import LogisticRegression
from sklearn.linear_model  import Ridge
from sklearn.linear_model  import Lasso
from sklearn.neighbors  import KNeighborsClassifier
from sklearn.datasets import  make_regression
from  sklearn.model_selection import train_test_split
from sklearn import  datasets
from sklearn.pipeline  import Pipeline
from sklearn.preprocessing  import StandardScaler
from sklearn.svm import  LinearSVR
import statsmodels.api as  sm
class data_for_model:
def machine_learn(data,model):
if data ==  "iris":
     mydata = datasets.load_iris()
elif data ==  "wine":
     mydata = datasets.load_wine()
elif data ==  "breast_cancer":
     mydata = datasets.load_breast_cancer()
elif data == "diabetes":
     mydata = datasets.load_diabetes()
elif data ==  "boston":
     mydata = datasets.load_boston()
elif data !=  "two_moon":
     return "提供的数据错误,包括:iris,wine,barest_cancer,diabetes,boston,two_moon"
if data ==  "two_moon":
     X,y = datasets.make_moons(n_samples=200,noise=0.05,  random_state=0)
elif model ==  "DecisionTreeClassifie"or "RandomForestClassifie":
    X,y = mydata.data[:,:2],mydata.target
else:
    X,y = mydata.data,mydata.target
       X_train,X_test,y_train,y_test =  train_test_split(X, y)
        if model ==  "LinearRegression":
               md =  LinearRegression().fit(X_train,y_train)
        elif model ==  "LogisticRegression":
               if data == "boston":
                    y_train =  y_train.astype('int')
                    y_test =  y_test.astype('int')
               md =  LogisticRegression().fit(X_train,y_train)
        elif model == "Ridge":
               md =  Ridge(alpha=0.1).fit(X_train,y_train)
        elif model == "Lasso":
               md = Lasso(alpha=0.0001,max_iter=10000000).fit(X_train,y_train)
        elif model == "SVM":
               md =  LinearSVR(C=2).fit(X_train,y_train)
        elif model == "sm":
               md = sm.OLS(y,X).fit()
else:
               return "提供的模型错误,包括:LinearRegression,LogisticRegression,Ridge,Lasso,SVM,sm "
        if model == "sm":
                print("results.params(diabetes):\n",md.params,  "\nresults.summary(diabetes):\n",md.summary())
        else:
            print("模型:",model,"数据:",data,"训练集评分:{:.2%}".format(md.score(X_train,y_train)))
            print("模型:",model,"数据:",data,"测试集评分:{:.2%}".format(md.score(X_test,y_test)))


在这里考虑:

  • LogisticRegression算法在波士顿房价下要求目标y必须为int类型,所以做了判断;
  • Ridge 算法的alpha参数为0.1
  • Lasso算法的alpha参数为0.0001, 最大迭代数为10,000,000

这样,我们就可以对指定模型指定数据进行定量分析


from  machinelearn_data_model import data_for_model
def  linear_for_all_data_and_model():
        datas =  ["iris","wine","breast_cancer","diabetes","boston","two_moon"]
        models =  ["LinearRegression","LogisticRegression","Ridge","Lasso","SVM","sm"]
        for data in datas:
                for model in models:
                         data_for_model.machine_learn(data,model)


我们对测试结果进行比较:


数据

模型

训练集

测试集

鸢尾花

LinearRegression

92.7%

93.7%

LogisticRegression

96.4%

100%

Ridge

93.1%

92.8%

Lasso

92.8%

93.1%

StatsModels OLS

0.972

鸢尾花数据在所有训练模型下表现均很好

红酒

LinearRegression

90.6%

85.1%

LogisticRegression

97.7%

95.6%

Ridge

90.2%

86.8%

Lasso

91.0%

85.2%

StatsModels OLS

0.948

红酒数据在所有训练模型下表现均很好,但比鸢尾花略差些

乳腺癌

LinearRegression

79.1%

68.9%

LogisticRegression

95.3%

93.0%

Ridge

75.7%

74.5%

Lasso

77.6%

71.4%

StatsModels OLS

0.908

乳腺癌数据仅在逻辑回归OLS模型上表现很好

糖尿病

LinearRegression

52.5%

47.9%

LogisticRegression

02.7%

00.0%

Ridge

51.5%

49.2%

Lasso

51.5%

50.2%

StatsModels OLS

0.106

糖尿病数据在所有模型下表现均不好

波士顿房价

LinearRegression

74.5%

70.9%

LogisticRegression

20.8%

11.0%

Ridge

76.0%

62.7%

Lasso

73.5%

74.5%

StatsModels OLS

0.959

波士顿房价数据仅在OLS模型上表现很好,在其他模型下表现均不佳。但是处理逻辑回归模型下,表现比糖尿病略好。

2个月亮

LinearRegression

66.9%

63.0%

LogisticRegression

89.3%

86.0%

Ridge

66.3%

64.3%

Lasso

65.3%

65.2%

StatsModels OLS

0.501

2个月亮数据在LogisticRegressio模型下表现最好,其他表现不太好。


总结如下表(绿色表现好,红色表现不好,紫色一般):


数据类型

LinearRegression

LogisticRegression

Ridge

Lasso

OLS

鸢尾花






红酒






乳腺癌






糖尿病






波士顿房价






2个月亮







我们最后把KNN算法也捆绑进去,machinelearn_data_model.py经过如下改造


elif model == "KNeighborsClassifier":
if data == "boston":
y_train = y_train.astype('int')
y_test = y_test.astype('int')
md = KNeighborsClassifier().fit(X_train,y_train)
else:
       return "提供的模型错误,包括:LinearRegression,LogisticRegression,Ridge,Lasso,SVM,sm,KNeighborsClassifier"…


调用测试程序

from machinelearn_data_model import data_for_model
def KNN_for_all_data_and_model():
        datas =  ["iris","wine","breast_cancer","diabetes","boston","two_moon"]
        models =  ["KNeighborsClassifier"]
        for data in datas:
                for model in  models:
                         data_for_model.machine_learn(data,model)


得到测试结果


数据

模型

训练集

测试集

鸢尾花

KNeighborsClassifier

95.5%

97.4%

红酒

KNeighborsClassifier

76.7%

68.9%

乳腺癌

KNeighborsClassifier

95.3%

90.2%

糖尿病

KNeighborsClassifier

19.6%

00.0%

波士顿房价

KNeighborsClassifier

36.4%

04.7%

2个月亮

KNeighborsClassifier

100.00%

100.00%


由此可见,KNeighborsClassifier对鸢尾花,乳腺癌和2个月亮数据是比较有效的。


数据类型

KNeighborsClassifier

鸢尾花


红酒


乳腺癌


糖尿病


波士顿房价


2个月亮


 

——————————————————————————————————


软件安全测试

https://study.163.com/course/courseMain.htm?courseId=1209779852&share=2&shareId=480000002205486

接口自动化测试

https://study.163.com/course/courseMain.htm?courseId=1209794815&share=2&shareId=480000002205486

DevOps和Jenkins之DevOps

https://study.163.com/course/courseMain.htm?courseId=1209817844&share=2&shareId=480000002205486

DevOps与Jenkins 2.0之詹金斯

https://study.163.com/course/courseMain.htm?courseId=1209819843&share=2&shareId=480000002205486

硒自动化测试

https://study.163.com/course/courseMain.htm?courseId=1209835807&share=2&shareId=480000002205486

性能测试第1季:性能测试基础知识

https://study.163.com/course/courseMain.htm?courseId=1209852815&share=2&shareId=480000002205486

性能测试第2季:LoadRunner12使用

https://study.163.com/course/courseMain.htm?courseId=1209980013&share=2&shareId=480000002205486

性能测试第3季:JMeter工具使用

https://study.163.com/course/courseMain.htm?courseId=1209903814&share=2&shareId=480000002205486

性能测试第4季:监控与调优

https://study.163.com/course/courseMain.htm?courseId=1209959801&share=2&shareId=480000002205486

Django入门

https://study.163.com/course/courseMain.htm?courseId=1210020806&share=2&shareId=480000002205486

啄木鸟顾老师漫谈软件测试

https://study.163.com/course/courseMain.htm?courseId=1209958326&share=2&shareId=480000002205486

相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
目录
相关文章
|
2天前
|
测试技术
测试用例设计方法之基本路径测试法
基本路径测试法是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例的方法,设计出的测试用例要保证在测试中程序的语句覆盖100%,条件覆盖100%
15 7
测试用例设计方法之基本路径测试法
|
1天前
|
敏捷开发 数据可视化 Devops
敏捷测试价值观、方法和实践读书笔记(4)
本章节探讨了敏捷测试执行的关键概念与实践。首先介绍了用户故事及其重要性,强调其在敏捷开发中的角色,并阐述了用户故事的 INVEST 原则。接着分析了用户故事生命周期中的测试关注点,包括定义、处理、完成及验收阶段的测试活动。此外,还对比了不同测试术语的差异,并提供了敏捷测试计划的策略与过程。通过看板等工具实现任务管理与跟踪,确保测试活动高效进行。最后,介绍了敏捷测试中的度量指标,帮助团队评估测试效果。
13 5
敏捷测试价值观、方法和实践读书笔记(4)
|
1天前
|
监控 架构师 Devops
敏捷测试价值观、方法和实践读书笔记(3)
本章节介绍敏捷测试转型框架,涵盖模型概览、实施难度与顺序、文化转变、角色技能需求及测试流程。敏捷测试转型模型包括文化、组织、流程与实践等关键要素,并针对各层面提出具体实施建议与障碍解决方案。此外,详细阐述了不同敏捷测试角色的技能需求与职责,以及从Sprint内至跨Sprint的测试流程与交付物。
9 5
敏捷测试价值观、方法和实践读书笔记(3)
|
1天前
|
开发框架 数据可视化 项目管理
敏捷测试价值观、方法和实践读书笔记(1)
敏捷软件开发宣言在身体力行的同时也帮助我们一直在实践中探寻更好的软件开发方法。由此,我们建立了如下价值观:个体和互动 高于 流程和工具工作的软件,高于 详尽的文档客户合作, 高于 合同谈判响应变化,高于 遵循计划。也就是说,尽管右项有其价值,但我们更重视左项的价值。
9 4
敏捷测试价值观、方法和实践读书笔记(1)
|
1天前
|
JavaScript 前端开发 Java
敏捷测试价值观、方法和实践读书笔记(5)
本章节介绍了敏捷功能测试的原则与实践,包括单元测试的概念及其编写步骤,测试驱动开发(TDD)的流程,以及如何通过模拟对象进行测试。详细讲解了单元测试的编写方法,如初始化对象、执行操作及验证结果,并探讨了 TDD 的五个步骤。通过具体案例展示了如何逐步完善储蓄账户的功能测试,包括存款、取款及异常处理。此外,还讨论了代码覆盖率的重要性及其局限性,强调了测试充分性比单纯追求代码覆盖率更为关键。
8 3
敏捷测试价值观、方法和实践读书笔记(5)
|
1天前
|
机器人 测试技术
敏捷测试价值观、方法和实践读书笔记(6)
验收测试驱动开发(ATDD)强调在开发前定义验收标准,并通过自动化测试确保用户价值得到满足。验收测试关注用户需求是否实现,而非代码细节。ATDD涉及用户、产品负责人、开发人员及测试人员,通过讨论、开发和交付三个阶段,确保产品符合预期。此方法有助于团队更好地理解和实现用户需求。
10 5
|
1天前
|
敏捷开发 测试技术
敏捷测试价值观、方法和实践读书笔记(2)
本章节介绍敏捷测试在快速变化的软件开发环境中的重要性。传统测试方法在敏捷环境中面临时间紧迫、文档不足、频繁变更及资源短缺等挑战。敏捷测试遵循敏捷开发原则,强调测试与开发的紧密融合、团队协作及业务价值交付。其特点包括更强的协作、更短的周期、更灵活的计划及高效的自动化。相较于传统测试,敏捷测试具有加快产品上市时间、提升整体质量及简化流程降低成本的优势。
9 3
|
1天前
|
Devops jenkins 测试技术
敏捷测试价值观、方法和实践读书笔记(10)
本文介绍了敏捷测试的延伸实践,重点讨论了持续集成(CI)和持续部署(CD)的概念与实践方法。持续集成强调频繁提交代码至主干并自动化构建测试,确保快速反馈和高质量代码。持续部署则进一步实现自动化部署,通过蓝绿部署、金丝雀发布等方式提升软件交付效率。此外,文章还探讨了持续反馈机制,如A/B测试和混沌工程,以及DevOps文化下的测试策略,强调测试在整个开发流程中的重要性。
6 0
敏捷测试价值观、方法和实践读书笔记(10)
|
1天前
|
XML 存储 API
敏捷测试价值观、方法和实践读书笔记(8)
本文介绍了API的基础知识,区分了Web Service和Web API的概念,详细阐述了Web Service中的SOAP服务和REST服务的特点及区别。同时,文章还探讨了如何在项目中进行API测试,包括API测试的类型和实施阶段,强调了API在现代软件开发中的重要性和优势。
4 0
敏捷测试价值观、方法和实践读书笔记(8)
|
1天前
|
JavaScript 前端开发 Java
敏捷测试价值观、方法和实践读书笔记(7)
本文介绍了BDD(行为驱动开发)的Given-When-Then方法,并详细描述了如何在Java环境中使用Cucumber框架实现BDD测试。内容涵盖配置环境、修改POM文件、编写Feature文件及步骤定义文件、运行测试等过程。同时,提供了使用Cucumber和Selenium对Web页面进行测试的具体示例,并探讨了BDD在团队中的实施策略,包括不同角色之间的协作流程与自动化测试框架的选择。
5 0
敏捷测试价值观、方法和实践读书笔记(7)