精华内容
下载资源
问答
  • AB test 实验简介及目的:为了评估产品某个功能是否有效,将产品分为实验组对照组,分别部署单一变量的产品,后随机分配给具有相似性的几组用户进行测试,最后根据得到的数据分析哪个产品效果更好。数据来源:...

    AB test 实验简介及目的:

    为了评估产品某个功能是否有效,将产品分为实验组和对照组,分别部署单一变量的产品,后随机分配给具有相似性的几组用户进行测试,最后根据得到的数据分析哪个产品效果更好。

    数据来源:https://www.kaggle.com/klaudy/ab-test-practice-case

    一、数据清洗与处理

    导入数据,了解数据的大致情况。

    import os
    import numpyas np
    import pandasas pd
    import seabornas sns
    import datetimeas dt
    import matplotlib.pyplotas plt
    from scipy.stats import norm
    df=pd.read_csv('C:UsersDELLDesktopAB testab_data.csv')
    print(df.info())
    print(df.describe())
    print(df.sample(n=10))

    b9040aa04313b8a1cd39daed127b701a.png
    df.info()

    4b164c1ba9a0ba552e8c65e0e62afdf9.png
    df.sample(n=10)

    一共有294478行4列,未发现有空值。

    user_id:用户唯一识别ID,需要确认下有无重复 。

    timestamp:用户操作的时间,需将该列转换为时间戳格式。

    group:分为两组,treatment实验组,control 控制对照组。

    landing_page:treatment实验组对应new_page,control 控制对照组对应old_page可以从样本数据中看到有一个treatment实验组对照了old_page,样本数据中可能存在错误值,需要删除此类错误值。

    converted: 页面是否转化,1表示页面转化了,0表示未转化。

    接下来清洗数据:

    1.转换timestamp的数据格式为时间戳;

    2.删掉group和landing_page不一致的数据

    3.查找user_id是否重复并去重

    df["trans_date"] = pd.to_datetime(df["timestamp"])
    wrong_data1=df[(df.group=='treatment')&(df.landing_page=='old_page')]
    wrong_data2=df[(df.group=='control')&(df.landing_page=='new_page')]
    print(wrong_data1['user_id'].count()+wrong_data2['user_id'].count())#错误数据有3893行
    df_new=df.drop(index=wrong_data1.index)
    df_new=df_new.drop(index=wrong_data2.index)
    print(df_new.info())#删除错误数据后,还有290585行数据
    
    print(df_new[df_new['user_id'].duplicated()])#user_id为773192用户有重复值
    df_new=df_new.drop_duplicates('user_id')
    print(df_new[df_new['user_id'] == 773192])#user_id已去重

    清理后还有290584条有效数据:

    1ac6149b21440bfe8ede08b1bac6af68.png

    二、假设检验

    判断实验组和对照控制组对页面的转化是否有差异性的结果。

    先了解下新旧版本各自对应的转换率

    print((df_new['landing_page']=='new_page').mean())#用户看到新页面概率为50%,
    p_old = df_new[df_new['group'] == 'control']['converted'].mean()#对照组,旧页面转化率:12.04%
    p_new = df_new[df_new['group'] == 'treatment']['converted'].mean()#实验组,新页面转化率:12.30%

    零假设:p_old-p_new ≥0 (通常我们将想否认的结果作为零假设)

    备择假设:p_old-p_new<0

    根据备择假设 ,假设条件中符号为“<”,因此检验方向应为单侧左尾;

    样本大于30,总体的均值和标准差未知,用Z检验检验方法可为以下几类:

    方法一:根据公式计算检验统计量Z值

    检验统计量公式如下:

    eeb7fc8a82ab2354133706bc1d459894.png

    用python求z值及显著性水平

    =0.05时对应的
    的如下:
    p_total=df_new['converted'].mean() #即求Pc,值为12.17%
    z = (p_old - p_new)/ np.sqrt(p_total*(1 - p_total)*( 1/n_old + 1/n_new))#-2.1484
    z_alpha = norm.ppf(0.05)#-1.64485
    print("z:",z,"z_alpha:",z_alpha)

    890ab717e036d40d34ed868c1e335ec0.png

    拒绝域{

    },可以看出z值在拒绝域内,因此得出结论显著性水平
    =0.05时,拒绝零假设。

    方法二:使用Python包直接计算

    Z值和P值可以通过Python包直接算出

    import statsmodels.stats.weightstats as sw
    z_value, p_value = sw.ztest(df_new.query('landing_page=="old_page"')['converted'], df_new.query('landing_page=="new_page"')['converted'],
                            alternative='smaller')
    #依照备择假设的设定输入,alternative='smaller'表示左尾

    4c686bb0075ffd1f8c61e9608251b835.png

    Z值与公式所得基本一致。p=0.0158<

    =0.05,因此拒绝零假设。

    方法三:蒙特卡洛法:

    蒙特卡洛法即模拟多次抽样,获得分布。由于抽样是随机的,所以每次转化率结果也是不同的。

    记样本数据计算得到的检验统计量值为ori_diff(公式中的Zc)

    本案例为左尾检验,P值为当p_old=p_new时,检验统计量小于或等于根据实际观测样本数据计算得到的检验统计量值的概率,即

    综上,在做蒙特卡洛抽样时,我们记p_old与p_new的概率相等 ,统统为p_all,即样本总体转化率。

    p_diffs=[]
    for i in range(10000):
        p_new_diff = np.random.choice(2,size=n_new,p=[1-p_all,p_all]).mean()#新页面模拟
        p_old_diff = np.random.choice(2,size=n_old,p=[1-p_all,p_all]).mean()#旧页面模拟
        p_diffs.append(p_new_diff - p_old_diff)#新页面和旧页面转化率的平均值
    ori_diff=df_new.query('landing_page=="new_page"')['converted'].mean()-df_new.query('landing_page=="old_page"')['converted'].mean()
    print(obs_diff)#-0.002
    p_value=(p_diffs<obs_diff).mean()#计算p值
    plt.hist(p_diffs)
    print(p_value)#0.0161
    plt.axvline(obs_diff,color='red')
    plt.show()

    cee43f8b6abb82090246e43a31e08cec.png

    样本数足够多,我们得到了正态分布的结果图形,越靠近中间的部分,数值出现的次数越多,越靠近两侧,说明该数值出现的越少,情况越极端。图中红线左侧部分的面积即我们要求的P值,输出为0.0161,实际意义为:在p_new=p_old的情况下,只有1.61%的情况,p_old-p_new的表现比样本数据ab_data.csv中给出的更极端, 也就是说ab_data.csv中的数据表现在p_old-p_new≥0的假设下是小概率事件。因此零假设很大可能不成立。

    三、结论

    本文对ABtest进行数据统计,分析新旧页面的转化率以及其他因素的影响。给出了Python的三种方法进行AB test的假设检验的计算。通过分析可知,零假设不成立,即排拒绝旧页面转化率高于或等于新页面的可能,新页面的转化率很大机会高于旧页面,也就意味着我们可以将新页面投入使用了。

    展开全文
  • 单一样本t检验(One-samplettest),是用来比较一组数据的平均值一个数值有无差异。例如,你选取了5个人,测定了他们的身高,要看这五个人的身高平均值是否高于、低于还是等于1.70m,就需要用这个...

    你的分析结果有

    T

    值,有

    sig

    值,说明你是在进行平均值的比较。也就是你在比

    较两组数据之间的平均值有没有差异。

    从具有

    t

    值来看,你是在进行

    T

    检验。

    T

    检验是平均值的比较方法。

    T

    检验分为三种方法:

    1.

    单一样本

    t

    检验(

    One-sample t test

    ),是用来比较一组数据的平均值和一个

    数值有无差异。例如,你选取了

    5

    个人,测定了他们的身高,要看这五个人的身

    高平均值是否高于、低于还是等于

    1.70m

    ,就需要用这个检验方法。

    2.

    配对样本

    t

    检验(

    paired-samples t test

    ),是用来看一组样本在处理前后的

    平均值有无差异。

    比如,

    你选取了

    5

    个人,

    分别在饭前和饭后测量了他们的体重,

    想检测吃饭对他们的体重有无影响,就需要用这个

    t

    检验。

    注意,配对样本

    t

    检验要求严格配对,也就是说,每一个人的饭前体重和饭后体

    重构成一对。

    3.

    独立样本

    t

    检验

    (

    independent t test

    )

    是用来看两组数据的平均值有无差异。

    比如,你选取了

    5

    5

    女,想看男女之间身高有无差异,这样,男的一组,女

    的一组,这两个组之间的身高平均值的大小比较可用这种方法。

    总之,选取哪种

    t

    检验方法是由你的数据特点和你的结果要求来决定的。

    t

    检验会计算出一个统计量来,这个统计量就是

    t

    值,

    spss

    根据这个

    t

    值来计算

    sig

    值。因此,你可以认为

    t

    值是一个中间过程产生的

    数据,不必理他,你只需要看

    sig

    值就可以了。

    sig

    值是一个最终值,也是

    t

    检验

    的最重要的值。

    sig

    值的意思就是显著性(

    significance

    ),它的意思是说,平均值是在百分之几

    的几率上相等的。

    一般将这个

    sig

    值与

    0.05

    相比较,如果它大于

    0.05

    ,说明平均值在大于

    5%

    几率上是相等的,而在小于

    95%

    的几率上不相等。我们认为平均值相等的几率

    还是比较大的,说明差异是不显著的,从而认为两组数据之间平均值是相等的。

    如果它小于

    0.05

    ,说明平均值在小于

    5%

    的几率上是相等的,而在大于

    95%

    几率上不相等。我们认为平均值相等的几率还是比较小的,说明差异是显著的,

    从而认为两组数据之间平均值是不相等的。

    总之,只需要注意

    sig

    值就可以了。

    前者是皮尔逊双侧检验的概率,所以选前者。

    具体选择单侧还是双侧,请参考以下标准:

    A.

    甲乙两个总体有差别时,

    甲高于乙或乙高于甲的可能性都存在,

    则选双侧检验

    B.

    在根据专业知识,只有一种可能性,则选单侧检验

    C.

    在预实验的探索中,一般用双侧检验

    D.

    在研究者只关心一种可能性时,选单侧检验

    展开全文
  • 第2天学习了python的函数、循环条件、类。第3天了解了Numpy这个工具库。第4、5两天掌握了Pandas这个库的基本用法。第6天学习了数据的合并堆叠。第7天开始学习数据清洗,着手学会了重复值删除、异常值处理、替换、...

    1cfad4760b5fa9c5ae4b83c8525bf2e2.png

    本文是【统计师的Python日记】第12天的日记

    回顾一下:

    • 第1天学习了Python的基本页面、操作,以及几种主要的容器类型。
    • 第2天学习了python的函数、循环和条件、类。
    • 第3天了解了Numpy这个工具库。
    • 第4、5两天掌握了Pandas这个库的基本用法。
    • 第6天学习了数据的合并堆叠。
    • 第7天开始学习数据清洗,着手学会了重复值删除、异常值处理、替换、创建哑变量等技能。
    • 第8天接着学习数据清洗,一些常见的数据处理技巧,如分列、去除空白等被我一一攻破
    • 第9天学习了正则表达式处理文本数据
    • 第10天学习了数据的聚合操作、数据透视表pivot_table()方法、交叉表crosstab
    • 第11天学习了class类的概念以及如何写一个类

    原文复习(点击查看):

    【第1天:谁来给我讲讲Python?】

    【第2天:再接着介绍一下Python呗】

    【第3天:Numpy你好】

    【第4天:欢迎光临Pandas】

    【第四天的补充

    【第5天:Pandas,露两手】

    【第6天:数据合并】

    【第7天:数据清洗(1)】

    【第8天:数据清洗(2)文本处理】

    【第9天:正则表达式】

    【第10天:数据聚合】

    【第11天:class 类—老司机的必修课】

    今天将带来第12天的学习日记,开始学习Python的机器学习库:Scikit-learn(这个系列会不断连载,建议关注哦~)。本文会先认识一下 sklearn 这个库,再根据建模流程,学习一下 sklearn 的各个模块的使用。


    目录如下:

    前言

    一、初识 sklearn

    二、sklearn 的建模流程

    1. 数据导入

    2. 数据处理

    (1)划分训练集和测试集

    (2)数据清洗

    3. 特征工程

    4. 模型调参/选择

    5. 模型测试和评价

    6. 模型保存和调用

    三、sklearn 建模流程总结 和 一个文本建模的例子


    前言

    前面学习了很多 Python 的数据基本操作,应付一个 project 前期的数据清洗、描述分析已然足够。今天开始要学习数据工程中的重头戏——数据建模。

    用 Python 完成一个模型的构建,比较快的可以有三种方法:

    ① 第一种是完全按照计算逻辑写代码,比如 logistic 回归模型,你可以这么写:

    (具体可以看这里:造出一艘logistic模型 | 【logistic从生产到使用】(下))

    2b58d514bdcbb8d044e3b5e62e9f89d4.png

    ② 第二种是用最近很火的 tensorflow 开源库,同样的 logistic 回归,简洁一点的话可以这么写:

    045c87dade82b5b310a064eed55eb55b.png

    ③ 第三种是用机器学习库 sklearn,logistic 回归我们只用这么写:

    e24b6340c87e974b7b2850b8538b18b5.png

    其他还有很多库就不说了,这三种中,第二种或者第三种显然是合理的选择。

    • tensorflow 是一种深度学习库,有很高的自由度,需要自己实现算法。适合数据量较大、一般需要GPU加速的运算。
    • 而sklearn 是通用机器学习库,里面已经包含了很多现成的深度学习算法、机器学习模型,以及数据预处理和特征工程。封装的高度抽象化,简单易用,适合中小型的机器学习项目,那种数据量不大、CPU上就可以完成的运算。

    所以,对于初学者来说,sklearn是首选,因为它不仅封装了大量的机器学习库,还自带数据集!连学习要用的数据都准备好了,今天,就先学习一下 sklearn。

    一、初识sklearn

    sklearn 全称是 scikit-learn,它建立在 Numpy 和 matplotlib 的基础上,所以需要注意的是,以下我们介绍的方法,都是适用于 Numpy 数组的哦。现在我们导入这个库:

    import sklearn

    这个库里面包含了很多数据集、模块和函数,使用某几种函数,可以不用全部导入,用:

    from sklearn.模块 import XX

    比如:

    from sklearn import datasets
    from sklearn.feature_selection import SelectKBest
    from sklearn.neighbors import KNeighborsClassifier

    sklearn 有专门的 feature_selection (特征工程)和 neighbors(近邻算法)模块,下面有对应的方法。如上代码展示:

    • feature_selection 模块下面不仅有 SelectKBest(选出K个得分最高的特征),还有chi2(计算每个特征的卡方值)等等;
    • neighbors模块下不仅有KNeighborsClassifier(K近邻),还有LocalOutlierFactor(LOF异常检测算法)等算法可供调用。

    那么 sklearn 主要有哪些模块,每个模块下面有哪些方法呢?

    我数了一下 sklearn 的官方介绍,大概37个模块,包含了差不多500种算法实现(http://scikit-learn.org/stable/modules/classes.html)。

    这里列出了我们建模常用的一些模块和算法:

    3eed909e7d44f72001c0977584138c5e.png

    其实,只要学习一种方法的典型流程,其他的方法查查资料就可以很快上手。现在我们就以内部数据集为例,用 sklearn 学习一遍整个建模的流程。

    二、sklearn 的建模流程

    1. 数据导入

    (1)导入自带数据

    我们要导入最经典的sklearn自带「鸢尾花」数据。先了解一下数据结构,首先,导入数据集 load_iris。

    #从sklearn的自带datasets中导入load_iris数据集
    from sklearn.datasets import load_iris 
    iris = load_iris()

    看下数据的结构,用keys来看:

    print (iris.keys())

    结果如下:

    dict_keys(['target_names', 'target', 'data', 'feature_names', 'DESCR'])

    target 是标签数据,target_names 标签每个类别的意义,data 是特征数据, feature_names 是特征列名,DESCR 是关于此数据的一个全面描述。

    比如查看 target.name,数据的lable分类:

    print(iris.target_names)
    

    a5323c7e890fda83d258b712f97d7537.png

    可知lable一共有三类。同理 iris.target 就是具体 lable 的数据,iris.data 就是特征的数据了。

    print(iris.target)

    5fd24eee9deb259cb8c76be2fd44b3a0.png

    我们也可以直接来看 DESCR,有更全面的介绍:

    print(iris.DESCR)

    21989c1f2ca097ebf1f80137930fe998.png

    从描述可以看出,这个数据

    • 一共150行;
    • label 是鸢尾花的类型,有三类:Setosa/Versicolour/Virginica;
    • 共四个特征:萼片sepal的长度和宽度,花瓣petal的长度和宽度,我们就要用这四个特征,来预测鸢尾花的类型。

    如果是外部数据,我们可以用 pandas 的read_csv工具来导入,详见 第5天:Pandas,露两手。

    2. 数据处理

    (1)划分数据集

    首先是训练集和测试集的划分,在Python中建模,我们至少需要四个子数据集:

    • 训练数据-特征列
    • 训练数据-label列
    • 测试数据-特征列
    • 测试数据-label列

    记得在 SAS 中,特征和lable是不需要分开的,在一个数据集中,建模的时候只需要在proc过程中指定出哪一列是 lable 就好。在Python中是需要分开的。

    训练数据和测试数据的划分,可以用 train_test_split() 处理,以 iris 数据为例,划分方式如下:

    from sklearn.model_selection import train_test_split
    X=iris.data
    y=iris.target
    X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3,random_state=0)
    

    test_size 指定测试样本的比例,random_state 是随机数种子,如果random_state的设置是相同的,那么别人运行你的代码就会和你得到完全一样的数据。

    (2)数据清洗

    现在数据已经导入,用 preprocessing 来做一些预处理:

    • 填充缺失值:
    from sklearn.preprocessing import Imputer
    impt= Imputer(missing_values='NaN', strategy='mean', axis=0)
    #还可以用"median"、"most_frequent"等来填充          
    impt.fit(X)         
    impt.transform(X) 
    • 数据标准化(有时候特征的量纲不一致,或者存在很多异常值,需要进行标准化处理)
    from sklearn import preprocessing
    X_scale = preprocessing.scale(X)  

    在前面我们也学习了Pandas Dataframe数据的一些预处理方法(详见 第5天:Pandas,露两手 和 第7天:数据清洗(1)),比如:

    • 丢弃缺失值:df.dropna()
    • 填充缺失值:data.fillna()

    等等,可以在Dataframe中处理好,再转换成 Numpy array 数组。

    3. 特征工程

    我们现在对这四个特征进行筛选,使用 feature_selection 模块的 SelectFpr 来进行选择,选出P值在0.01以下的特征。格式是:

    selectFpr(<func>, alpha)

    <func>是筛选的统计方法,默认是方差检验的F检验对应p值,此外还可以选chi2(卡方检验)

    • f_regression(回归的F检验P值)
    • mutal_info_regression(利用特征和标签之间的互信息)
    • 等等,具体可查阅官网
    from sklearn.feature_selection import SelectFpr
    selectFea=SelectFpr(alpha=0.01)
    X_train_new = selectFea.fit_transform(X_train, y_train)
    X_test_new = selectFea.transform(X_test)

    这里 fit_transform() 在数据处理环节我们会经常看到,

    A.fit_transform()

    以及

    A.transform()

    • A.fit_transform()

    是对前面的方法A先进行数据拟合fit,如果A是一个标准化处理的方法,那么fit就可以拟合出数据的均值、方差等参数。这里A是要选择P值,fit就会拟合出每个特征的P值等......再利用这些参数对数据进行transform(),得到最终我们要的数据。

    • A.transform()

    按照上面说的,这个就是直接对已经fit过的进行transform了。通常train的数据既要fit又要transform,测试数据只要也必须要transform。“只要”是因为已经fit过了,就用测试集fit的结果,“必须要”是测试集的特征选择必须要和训练集的选择结果一致。

    特征选择的时候,我们通常不会那么粗暴,还会综合考虑特征的IV值、WOE分等,网上很多代码,推荐学习:https://www.sohu.com/a/227312722_479788

    4. 模型调参/选择

    选择完特征,我们需要选择一个合适的模型。思路是:

    先指定若干分类模型,每个模型在测试数据集上进行参数的【网格搜索+交叉验证】,选出表现最好的模型和其参数。

    首先,导入一些待验证的分类模型:

    #MultinomialNB 离散型朴素贝叶斯
    from sklearn.naive_bayes import MultinomialNB
    #LogisticRegression 逻辑回归
    from sklearn.linear_model import LogisticRegression
    #DecisionTreeClassifier 决策树
    from sklearn.tree import DecisionTreeClassifier
    #SVC 支持向量分类
    from sklearn.svm import SVC
    

    关于交叉验证,之前有学习过:

    K折交叉验证可以充分利用少样本的信息。
    K折交叉验证是将样本分成K个子样本集,拿出其中的K-1个子样本集来训练模型,用剩下的1个子样本集来对模型进行验证;再拿出K-1个训练模型,留下另外1个(与上一步的不同)子样本集进行验证......,如此交叉验证K次,每个子样本集验证1次,平均K次的结果作为一个模型的预测效果。

    具体可见这里:留一交叉验证及SAS代码

    交叉验证可充分利用样本的信息,在我们调参的时候,如果有多个模型供选择,或者一个模型需要选择一个最好的参数时,我们可以对每个模型进行一轮交叉验证,看那个模型或参数的效果最好。

    但是有一个问题,那么多模型,每个模型都要试不同的参数甚至参数组合,这样成本是不是太高了?用For循环去试,又不够灵活,层次太分明。网格搜索解决这个问题的一个利器。Sklearn 的 GridSearchCV 就有一个现成的子模块可以用。它其实就是代替了人工暴力穷举,并且把很多功能包在了一起,让我们在调参时很方便。子模块的调用如下:

    from sklearn.model_selection import GridSearchCV

    GridSearchCV 的参数,常用的如下:

    GridSearchCV(estimator, param_grid, scoring, cv)

    • estimator 是分类器,如 DecisionTreeClassifier();
    • parameter 是一个字典,它用来限定参数范围,一般取值是 {’参数名‘: 参数范围},比如决策树的参数一般是max_depth,其范围我们可以限定为 param_grid= {'max_depth': xrange(1, 10)},SVC 的参数有核函数(kernel),C 和 gamma,我们可以限定为:
      param_grid= {'kernel':('linear', 'rbf'), 'C':[1, 2, 4], 'gamma':[0.125, 0.25, 0.5 ,1, 2, 4]};
    • cv:交叉验证参数,指定K折验证,默认是3;
    • scoring 是模型的评价准则,如 roc_auc/recall/precision 等,可以缺失,默认使用 estimator 的误差估计函数,可选如下(来源官网):

    2bf562569102872576fc7a71ca1ed1ee.png

    关于 GribSearchCV 更详细的说明也可以看官网:

    https://scikit-learn.org/0.17/modules/generated/sklearn.grid_search.GridSearchCV.html

    需要注意的是,GribSearchCV 适合数据量比较小的场景,一旦数据量较大,就特别耗费计算资源和时间,此时还是得结合建模经验进行半手动调参,比如,可以先对一个影响最大得参数进行调参,得到最优后再调下一个参数,直到所有参数调节完,但这样得到得是一个局部最优而不是全局最优。

    以 DecisionTreeClassifier 为例,我们可以这样使用网格搜索:

    from sklearn.model_selection import GridSearchCV
    
    clf_DT=DecisionTreeClassifier()
    param_grid_DT= {'max_depth': [1,2,3,4,5,6]}
    grid=GridSearchCV(clf_DT, param_grid_DT, scoring='roc_auc', cv=5)
    grid.fit(X_train, y_train)
    

    然而,得到的结果是:

    cb3b7dbe7fbfe08cf61e7cd580261c63.png

    注意,有人会认为是 DecisionTreeClassifier 只能解决二分类的问题,并不是。当数据是多分类时,就算是 sklearn 的二分类器,也将多分类的转换处理考虑了进来,处理方法通常是 'ovr',即one-vs-rest,顾名思义,就是某一类相对于其他类的可能,将多分类做多次2分类,来实现多分类的问题。

    比如 LogisticRegression(),有一个默认的参数 multiclass=’ovr' 参数,SVC() 也有一个默认的参数 decision_function_shape='ovr',当数据是多分类时,都会自动用ovr算法进行处理。

    这里报错是因为scoring='roc_auc',这个评价方法只适用于二分类,我们索性换成 accuracy:

    from sklearn.model_selection import GridSearchCV
    
    clf_DT=DecisionTreeClassifier()
    param_grid_DT= {'max_depth': [1,2,3,4,5,6]}
    grid=GridSearchCV(clf_DT, param_grid_DT, scoring='accuracy', cv=5)
    grid.fit(X_train, y_train)
    
    print (grid.best_score_)
    print (grid.best_params_)

    用 best_score_ 查看最高的得分,用 best_params_ 查看最优的参数,print 结果是:

    0.9523809523809523 {'max_depth': 5}

    现在对这4个模型,我们都搜索一遍参数:

    from sklearn.model_selection import GridSearchCV
    
    clf_DT=DecisionTreeClassifier()
    param_grid_DT= {'max_depth': [1,2,3,4,5,6]}
    
    clf_MNB=MultinomialNB()
    param_grid_MNB= {'alpha': [0.01,0.05,0.1,0.25,0.5,0.7,1]}
    
    clf_Logit=LogisticRegression()
    param_grid_logit= {'solver': ['liblinear','lbfgs','newton-cg','sag']}
    
    clf_svc=SVC()
    param_grid_svc={'kernel':('linear', 'rbf'), 
                    'C':[1, 2, 4], 
                    'gamma':[0.125, 0.25, 0.5 ,1, 2, 4]}
    
    clf=[clf_DT,clf_MNB,clf_Logit,clf_svc]
    param_grid=[param_grid_DT,param_grid_MNB,param_grid_logit,param_grid_svc]
    
    
    for i in range(0,4):
        grid=GridSearchCV(clf[i], param_grid[i], scoring='accuracy', cv=5)
        grid.fit(X_train, y_train)
        print (grid.best_params_,': ',grid.best_score_)

    输出结果是:

    {'max_depth': 4} : 0.9523809523809523
    {'alpha': 0.01} : 0.7047619047619048
    {'solver': 'sag'} : 0.9619047619047619
    {'C': 2, 'kernel': 'linear', 'gamma': 0.125} : 0.9809523809523809

    所以 accuracy 最高的是 SVC,0.98,参数是

    {'C': 2, 'kernel': 'linear', 'gamma': 0.125},

    我们最终选择的模型:SVC(C=2, kernel='linear', gamma=0.125)

    5. 模型测试和评价

    我们在训练和调参时,用的是交叉验证,即只用了部分训练数据来训练,确定了最佳模型和参数之后,我们要用所有的训练样本再训练一遍作为预测模型,因为样本不能浪费。

    clf=SVC(C=2, kernel='linear', gamma=0.125)
    clf.fit(X_train, y_train)
    clf.predict(X_test)
    

    clf.predict(X_test),是fit后的模型在 X_test 上进行预测。预测完之后,可以用个 sklearn 的 metric 模块进行模型的评价,比如计算准确率、精准率和召回率:

    from sklearn import metrics
    
    y_pred = clf.predict(X_test)
    
    #accuracy
    accuracy=metrics.accuracy_score(y_true=y_test, y_pred=y_pred)
    print ('accuracy:',accuracy)
    
    #precision
    precision=metrics.precision_score(y_true=y_test, y_pred=y_pred,average="micro")
    print ('precision:',precision)
    
    #recall
    recall=metrics.recall_score(y_true=y_test, y_pred=y_pred,average="micro")
    print ('recall:',recall)
    
    #实际值和预测值
    print (y_test)
    print (y_pred)

    注意这里是多分类数据,因此计算精准和找回的时候需要加参数 average="micro"。结果如下:

    accuracy: 0.9777777777777777 precision: 0.9777777777777777 recall: 0.9777777777777777
    y_test: [2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0 2 1 0 2 2 1 0 1 1 1 2 0 2 0 0] y_pred: [2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0 2 1 0 2 2 1 0 2 1 1 2 0 2 0 0]

    我们再用之前其他三个模型的最优参数预测一下,看表现有什么不同,三个模型分别是:

    clf_MNB=MultinomialNB(alpha=0.01)
    clf_DT=DecisionTreeClassifier(max_depth=4)
    clf_logit=LogisticRegression(solver='sag')
    

    具体 code 略去,直接看结果:

    clf_MNB: accuracy: 0.6 precision: 0.6 recall: 0.6
    clf_DT: accuracy: 0.9777777777777777 precision: 0.9777777777777777 recall: 0.9777777777777777
    clf_logit: accuracy: 0.9333333333333333 precision: 0.9333333333333333 recall: 0.9333333333333333

    可以看出 SVC 确实是几个模型中表现最好的。

    6. 模型保存和调用

    模型的保存和调用,使用 sklearn 的 joblib 子模块:

    from sklearn.externals import joblib
    #模型保存到本地
    joblib.dump(clf,'SVC_model.m')
    #模型的恢复
    clf_tmp=joblib.load('SVC_model.m')
    

    三、sklearn 建模流程总结

    现在来总结一下 sklearn 建模的大致流程以及相关知识点:

    1. 数据导入

    • sklearn 自带数据集:sklearn.datasets
    • 外部数据导入:pd.read_csv()

    2. 数据处理

    (1)划分训练集和测试集

    • model_selection.train_test_split()

    (2)数据清洗

    • 缺失值填充:preprocessing.Imputer()
    • 数据标准化:preprocessing.scale()

    3. 特征工程

    • 根据P值选:feature_selection.SelectFpr()
    • 选出K个最高分特征:feature_selection.SelectKBest()

    4. 模型调参/选择

    • 交叉验证+网格搜索:model_selection.GridSearchCV()

    5. 模型测试和评价

    • 模型预测:model.predict()
    • Accuracy:metrics.accuracy_score()
    • Presicion:metrics.precision_score()
    • Recall:metrics.recall_score()

    6. 模型保存和调用

    • 模型保存:joblib.dump()
    • 模型调用:joblib.load()

    以上就是 sklearn 建模的一个大体流程,无论是特征工程还是数据处理、建模,无论是有监督模型还是无监督学习,Sklearn 都封装了成熟的模块供我们调用。

    关注公众号「数说工作室」继续阅读更多文章:

    量化投资之资本资产定价模型(CAPM)

    class 类—老司机的必修课 | 统计师的Python日记 第11课

    大规模文本处理(2)| 海量文本用 Simhash, 2小时变4秒!

    展开全文
  • 箱线图(BoxPlot)也称为箱形图、箱须图或盒式图等,是用于显示一组数据分散情况的统计图,最初由美国数学家JohnTukey于1970年提出(也是提出著名Tukey检验的那位),至今已整整半个世纪。它能同时反映数据统计量整体...

    86a55b37d8a3e18eb207187d230853eb.gif

    箱线图(BoxPlot)也称为箱形图、箱须图或盒式图等,是用于显示一组数据分散情况的统计图,最初由美国数学家JohnTukey于1970年提出(也是提出著名Tukey检验的那位),至今已整整半个世纪。它能同时反映数据统计量和整体分布,成为现在最常用的统计图形之一。

    箱线图因形状如箱子而得名,“箱子”从上到下展示的是上四分位数(75thQuantile,箱子上边线)、中位数(median,箱子中间的线)和下四分位数(25thQuantile,箱子的下边线),其中上四分位数和下四分位数之间的距离称为四分位距(Inter-QuartileRange,IQR),“胡须”即延伸线,延伸至除离群值外的最大值和最小值,超出上下四分位数1.5倍IQR的值被认为是离群值。

    bb4d4689c1e4c220802f83590daaffb8.png

    关于箱线图其它的一些基本情况大家可以参见我们以前的推送《试验研究中的利器--强大的直方图和箱线图》。这种漂亮的展示图还发展出许多变体,是数据可视化的重要工具,也帮助克服了传统箱线图的一些缺陷。今天小编就给大家介绍一些常用的变体箱线图。

    1. 可变宽度箱线图(Variable Width Box Plot):箱子的宽度反映出样本的大小,样本量越大,箱子越宽。这种形式可以结合其他形式同时使用。

    bfd3cba95271520a7fed397aaa6281b8.png

    2. 缺口箱线图(Notched Box Plot):中位数的值用缺口表示,缺口的宽度可表示中位数的置信区间,方便比较几组数据中位数的差别。

    9451fd06fc669264542012bfb5b0aa5a.png

    3. 花瓶图(Vase Plot):箱子由花瓶形状代替,引入参数估算数据的密度。

    f35f23cdf1fa0890c0880e1cebfe56e4.png

    4. 基于对数据的密度估算,又发展出几种相似的形式——小提琴图(Violin Plot)、豆荚图(Bean Plot)、蜂群图(Beeswarm Box Plot)等。这类图相当于是箱线图和密度分布图的结合,箱线图展示了分位数的位置,密度分布图展示了任意位置的密度,通过图形我们可以知道哪些位置的密度较高,也方便比较几组数据密度分布的差别。

    e292cc3ba138e687b3e45eec144512e1.png

    箱线图发展于电脑普及前的时期,可以手动计算并绘制出。然后也是由于这个原因,传统箱线图对于较大样本数据的展示会有一些缺陷。例如,对于较小样本的数据集(200以下),箱线图计算出的离群值一般不超过10个,但对于大样本数据集(10,000以上)则会出现较多的离群值,但实际上这些值可能都是正常观测值。如果使用上述提及的方式结合数据的密度分布,则会引入调整曲线平滑的参数,但这些都不能最客观地反映数据本身的特征。

    最近HeikeHofmann、Hadley Wickham和KarenKafadar提出的增强箱图(直译“字母值图”,Letter-ValuePlot)可以解决这一问题,基本原理是用一系列的箱图代替了延伸线,绘制出更多的分位数来提供数据分布的信息,对大数据时代的数据可视化非常有帮助。

    3eae9eac621696fe51942b5c9f593fa6.png

    参考资料和延伸阅读:

    Hofmann H., Wickham H. & Kafadar K.(2017). Letter-value plots: Boxplots for large data. Journal ofComputational and Graphical Statistics, 26, 469-477. https://doi.org/10.1080/10618600.2017.1305277

    Wickham H. & Stryjewski L. (2011).40 years of boxplots. http://vita.had.co.nz/papers/boxplots.pdf

    Ribecca S. (2017). Further Exploration#4 Box Plot Variations. The Data Visualisation Catalogue. http://datavizcatalogue.com/blog/box-plot-variations/

    033506d68c5505f5b9a1ffc4d11d9bdc.gif

    系列相关推送:

    试验数据统计中常用的量,图,和线--再也不担心文章的统计用图了!

    试验研究中的利器--强大的直方图和箱线图

    7635422b707b41c59fa475a8fad8ba32.png

    发表SCI 论文很迷茫?来找「投必得」帮忙

    34c73acd8dcae420533e630a47cd8423.png

    展开全文
  • 为什么计算置信度? 在推荐场景下,我们会研发一些策略,来提升业务指标,在做AB实验...t检验,通常会应用于三种情况的检验,分别是单样本t检验、双样本t检验和配对样本t检验。 这里着重说下配对样本t检验,跟工作中
  • 老师您好:我现在想用随机前沿分析法来计算...▲滑动查看▲滑动查看往期回顾:互助问答第124期:大N小T面板回归问题空间计量LM检验问题互助问答第123期:贫困脆弱性指数波动不均匀问题互助问答第122期:关于DID...
  • P值假设检验里的α值

    千次阅读 2018-01-05 11:15:38
    比如你做一个假设( null hypothesis):你的女性朋友平均身高2米,输入你统计的样本数据后, 计算机给你返回的p值是0.03。这意味着如果你拒绝“女性朋友平均身高2米”这个结论,犯错的概率是0.03, 小于0.05...
  • 而智能交通系统中的运动目标检测技术则是计算机视觉领域一个备受关注的前沿课题,在城市交通构建方面得到了广泛的应用,随之而来的则是对数据量、目标检测精度实时见解的更高要求。那么开发者如何使用 Python 来...
  • EXCEL的TTEST求出t值,怎么算P?TTEST(array1,array2,tails,type) 返回与 t 检验相概率。Array1 为第一个数据集。Array2 为第二个数据集。Tails 指示分布曲线的尾数。如果 tails = 1, TTEST 使用单尾分布果 tails =...
  • cout请输入需要赋值计算的多项式名称(提示:一个大写字母):"; cin>>name; site=int(name-'A'); if(list[site].empty()) return wrong; display(name); cout请问:您确认要进行赋值计算吗?(Y/y):...
  • 一、TCP是怎么实现可靠传输的 TCP协议传输的特点主要是面向字节流、传输可靠、面向连接。...接收方:收到数据后,对数据以同样的方式进行计算,求出检验和,与发送方的进行比对。 注意:如果接收方
  • z-score会改变数据分布吗先...检验标准很简单,计算标准化的数据的均值标准差,因为z-score的结果就是让数据服从均值为0,标准差为1的正态分布。里面说z-score的效果是让数据转换成正态分布的说法是不正确的。z-sc...
  • apache的common.math用的类好像只有long[]observed,double[]expected参数,通常我的数据集只是一列一列的数据怎么计算这两个参数呢?尤其是z'g期望值。
  • 检验和:TCP检验和计算与UDP一样,在计算时要加上12byte的伪首部,检验范围包括TCP首部及数据部分,但是UDP的检验和字段为可选的,而TCP中是必须有的。计算方法为:在发送方将整个报文段分为多个16位的段,然后将...
  • 面试题:为什么TCP协议是可靠的?...检验和:TCP检验和计算与UDP一样,在计算时要加上12byte的伪首部,检验范围包括TCP首部及数据部分,但是UDP的检验和字段为可选的,而TCP中是必须有的。计算方法为...
  • 有人问C50的混凝土,试块检验报告全部合格,但是回弹仪检验结构,我们取了多组数据,强度都只有C45左右,而且碳化深度还是按零计算的,混凝土浇注已完成两个多月了,请问一下是怎么回事?从配合比上来分析,一般通过...
  • 通过模拟进场,平仓资金管理,然后计算夏普比率最大回撤等业绩指标,获取策略表现的相关信息。 回溯检验并不是完美地复制过去,有很多因素导致无法精确建模,例如无法准确估计滑点自有订单对市场的冲击等,...
  • 数据运营思维导图

    2018-04-26 14:24:22
    所有的数据都是靠积累沉淀才能发现问题,单一的数字没有任何意义,只能称为 “数值” 结合/拆分思路 追踪数据,多个维度结合分析。 从多个维度拆分数据 对比思路 大的营销事件作为节点单独标记,数据剔除出来...
  • 2019数据运营思维导图

    2019-03-29 21:34:09
    数据运营 作用&意义 知错能改,善莫大焉 —错在哪里,数据分析告诉你 运筹帷幄,决胜千里 —怎么做好“运筹”,数据分析告诉你 以往鉴来,未卜先知 —怎么发现历史的规律以预测未来,数据分析告诉你 工作思维 对业务...
  • 这两天在做个接收海量数据的项目,服务端接收处理客户端发送...本来想让他修改的,可出于升级工作和服务端刚建设的综合考虑,最后还是采取了服务端更改检验和计算方式的做法。为纪念为之付出艰辛调试的几个小时,...
  • 2.3可视化三、数据的集中度四、数据的离散度五、数据的相关性5.1案例5.2散点图5.3计算相关系数六、总结【概率与概率分布】一、描述性统计的局限性二、两种主要的数据类型三、概率四、应用4.1从分类型数据来看概率的...
  • 最近在研究随机函数,利用很多算法,改写了随机函数,但是我在想,改写后的随机函数的随机性能最好,谁最近真随机函数,需要用一种...3.把随机数连成一个数据序列,来统计1 0 的个数, 如果随机,应该是1:1. 我觉得
  • 2.发送方基于待发送的数据和生成多项式计算出差错检验码(冗余码),将其添加到待传输数据的后边一起传输。 3.接收方通过生成多项式来计算收到的数据是否产生了误码 对于生成多项式,这里举个例子: G(x) = x4 + ...
  • 三维量房:量房是建筑验收的重要依据,而建筑物墙面平整度是房屋质量检测验收得重要指标之一。同时也是装修的第一步,只有对房间布局及尺寸了如指掌,才能更好地进行接下来的装修设计、制定预算方案等工作。如何...
  • 按阶次递推用F检验法判断模型阶次的算法用如下模型计算出仿真数据,再按模型阶次递推算法的辨识方法,辨识模型的阶次参数。keku.ku.ku.ku.ku.kz.kz.kz.kz.kz.kz...
  • 数据在网上传递怎么样防止被黑客窃取听到? 硬盘上的文件中有敏感数据,如何防止被黑客看到? 主要内容 本章解决的是数据内容的安全性,介绍Java的加密解密技术。学完该章可以通过Java编程对各种数据进行各种形式...
  • 业务的描述使用的是业务层的概念,增删查改的描述使用的是持久层...业务体现在要不要修改,要修改哪里(什么属性)怎么修改(计算过程),以及最终实现的修改(赋值及数据检验)。当然,决定创建一个对象,以及...
  • excel的使用

    2012-11-25 17:06:01
    图8需要注意:如何确定自变量的初始值,数据点之间的步长是多少,这是要根据函数的具体特点来判断,这也是对使用者能力的检验。如果想很快查到函数的极值或看出其发展趋势,给出的数据点也不一定非得是等差的,可以...
  • 问题4-18:一个10 Mb/s以太网若工作在全双工状态,那么其数据率是发送接收各为5 Mb/s还是发送接收各为10 Mb/s? 问题4-19:一个单个的以太网上所使用的网桥数目有没有上限? 问题4-20:当我们在PC机插上以太网的...

空空如也

空空如也

1 2 3
收藏数 54
精华内容 21
关键字:

数据检验和怎么计算的