数据分析4——挖掘建模(监督学习中的分类、回归模型,无监督学习)

挖掘建模

1、机器学习与建模

学习:通过接收到的数据,归纳提取相同与不同
机器学习:让计算机以数据为基础,进行归纳与总结
模型:数据解释现象的系统
机器学习依据是否有标注可以分为:
在这里插入图片描述
监督学习就是有标注的机器学习过程。标注相当于告诉模型在什么样的数据特征下应该输出什么样的结果,机器学习的任务就是提炼出输入与标注间的关系,并进行预测。根据标注是离散值还是连续值,监督学习又分为分类过程和回归过程,如果标注是离散值,但它就是分类学习;如果标注是连续值,他就是回归学习。如果这个机器学习的过程没有标注,那它就是非监督学习,非监督学习是完全让数据自己说话,将数据自身的特征在不同的模型中进行不同的表现,非监督学习常见的有聚类分析和关联分析。有些机器学习的过程是部分有标注,部分没有标注的,这样的机器学习叫做半监督学习。半监督学习中有标注的数据可以作用于没有标注的数据,规范与引导聚类或者关联的方向,同时没有标注的数据也可以作用于有标注的数据,时刻获得模型对于数据整体的影响与反馈。

2、训练集、测试集、验证集

我们会把一份数据集,分成三个部分,即训练集,验证集和测试集。这三部分数据集的比例一般可以取6:2:2,它们各有各的用途。
训练集:用来训练与拟合模型,也就是说一个模型的参数是由训练集决定的。训练集的数据量越多,模型相对于整个数据集就会越准确。但训练集的数据量的增多,应该是以数据集整体数量的增多而不是通过提升训练集在整个数据集的比例来增长数据量。
验证集:当通过训练集训练出多个模型后,为了能找到效果最佳的模型,使用各个参数对验证集数据进行预测,并记录模型的准确率等评价指标,选出效果最佳的模型所对应的参数作为模型的最终参数。
测试集:通过训练集和验证集得出最优模型后,使用测试集进行模型的预测,用来衡量这个模型的性能和分类能力,我们可以把测试集当做从来不存在的数据集,将已经确定模型的参数使用测试集进行模型的泛化能力评价。
泛化能力:这里说的泛化能力就是模型面对训练集和验证集以外的未知数据或者实际场景的数据时预测能力的大小。如果一个模型在训练集和验证集表现良好,而测试集表现不好,那么该模型的泛化能力就比较差,这种现象也叫做过拟合现象。
交叉验证:一份数据集切分训练集、验证集、测试集的方法,这种方法可以叫做交叉验证。有的时候,我们会忽略验证集通过不断地重复的尝试来达到验证的目的,这样一个数据集就会只分为训练集和测试集,它的比例通常取4:1,也就是8:2,这些切分一般是随机的,为了全面衡量模型的质量,我们有时也会采取K折交叉验证。
K折交叉验证的思路就是把数据分成k份,如果不考虑验证集拿其中一份做测试集,其它的作为训练集考察模型一次,然后再拿另外一份做测试集,其它的作训练集再考察一次,以此类推,直到k份数据全部被当做过测试集,此时对模型的考察是比较全面且稳妥的。

def hr_modeling(features,label):
    
    #区分训练集和测试集
    from sklearn.model_selection import train_test_split
    
    #features、label是dataframe
    f_v=features.values
    l_v=label.values
    #我们需要得到6:2:2的比例,需要分两步进行切分
    #第一步,先得到验证集的数量,它占总体的20%
    X_tt,X_validation,Y_tt,Y_validation = train_test_split(f_v,l_v,test_size=0.2)
    #第二步,训练集:测试集=3:1,测试集占25%
    X_train,X_test,Y_train,Y_test = train_test_split(X_tt,Y_tt,test_size=0.25)

    print(len(X_train),len(X_validation),len(X_test))
    #结果为:8999 3000 3000

3、监督学习中的分类模型

分类模型主要涉及:KNN,朴素贝叶斯,决策树,支持向量机,集成方法,罗吉斯特映射,人工神经网络。其中罗吉斯特映射和人工神经网络大多数既可以做分类,也可以做回归。它们主要是以回归为主。

(1)KNN

距离的概念:
上一章我们已经学会了,怎么把属性都转换成数值类型。如果属性都成了数值,那每个属性都可以看作是一个维度,每个对象都是一个空间中的坐标,那么数据表中的对象与对象之间就会有它的距离。关于距离我们常用的公式有:
在这里插入图片描述
在这里插入图片描述
闵可夫斯距离公式中的P,P=1即曼哈顿距离;P=2即欧氏距离。
KD-Tree的概念:
在这里插入图片描述
在这里插入图片描述
如果一个空间中有很多的点,那么怎么去找我们随机指定的一个点附近的最近的k个点呢?
法1就是遍历每个点,然后进行从小到大的排序,但效率低下。
法2即KD-Tree,通过树形的结构,可以达到快速寻找最近点的目的。举例:首先将空间上的十六个数据用一种维度(竖线)分成两部分,两部分数量尽可能保持一致,然后拿其中的一个部分,再进行另外一个维度上(横线)的切分,又分成两部分,以此类推,直到不能切分为止,其它部分同样如此。之后,这个空间里就会分成许多大小不一的格子,每个格子都通过我们这里的线建立成一个树形的索引。这些深色的点对应图当中的线(即中间节点),而这些白色的点(即叶子结点)对应图当中的点,就可以形成这么一个树形结构。有了这样的树形结构,我们就可以很好的去找到一位点附近的最近的k个点。
比如我们这里出现一点,我们要找到离他最近的一个点:我们通过索引可以快速找到这个点,和哪个叶子结点在同一个区间内。于是我们可以计算出这个距离,但这个点不一定是离他最近的一个点,所以我们需要以这段距离为半径做一个圆,我们会发现一个或者几个与它相交的线。这样的话,我们就找到了这么一个中心节点,而通过这个中心节点,我们就可以快速的锁定的哪个叶子节点,可能离他更近。
KNN(k-Nearest Neighbors,K个最近的邻居)主要思想:
一个数据集都会有它的标注,如果说我找到了一个点,它K个最近的邻居,一种标注大于了另外一种标注,那么我们就认为这个点更倾向于与多数点是一致的。
在这里插入图片描述
举例:假设黑点为未知点,指定KNN的K=5,我们找到它最近的五个邻居,可以看到红色的点有三个,白色的点有两个,这样的话我们这个锁定的黑点就会判别成和这个红色的点同一个类型。

#接在def hr_modeling(features,label):函数里面
#KNN
    from sklearn.neighbors import NearestNeighbors,KNeighborsClassifier
    
    models=[]
    
    #n_neighbors指定邻居的数量
    knn_clf = KNeighborsClassifier(n_neighbors=3)
    knn_clf_n5=KNeighborsClassifier(n_neighbors=5)
    #对训练集进行拟合,得到一个模型
    knn_clf.fit(X_train,Y_train)
    knn_clf_n5.fit(X_train,Y_train)
    
    #用验证集进行验证
    Y_pred = knn_clf.predict(X_validation)
    Y_pred_n5 = knn_clf_n5.predict(X_validation)
    #衡量指标
    from sklearn.metrics import accuracy_score,recall_score,f1_score
    
    print("validation,n=3:")
    print("ACC:",accuracy_score(Y_validation,Y_pred))
    print("REC:",recall_score(Y_validation,Y_pred))
    print("F_Score:",f1_score(Y_validation,Y_pred))   
    print("validation,n=5:")
    print("ACC:",accuracy_score(Y_validation,Y_pred_n5))
    print("REC:",recall_score(Y_validation,Y_pred_n5))
    print("F_Score:",f1_score(Y_validation,Y_pred_n5)) 
    
    #用测试集进行对比
    Y_pred = knn_clf.predict(X_test)
    
    print("test:")
    print("ACC:",accuracy_score(Y_test,Y_pred))
    print("REC:",recall_score(Y_test,Y_pred))
    print("F_Score:",f1_score(Y_test,Y_pred))   
    
    #用训练集进行对比
    Y_pred = knn_clf.predict(X_train)
    
    print("train:")
    print("ACC:",accuracy_score(Y_train,Y_pred))
    print("REC:",recall_score(Y_train,Y_pred))
    print("F_Score:",f1_score(Y_train,Y_pred)) 
    #综上对比来看:
    #多次刷新结果进行对比,发现每次测试集都略低于训练集,
    #可能是有些过拟合,但是不明显,可以忽略
    
    #存储模型
    from sklearn.externals import joblib
    joblib.dump(knn_clf,"knn_clf")
    #使用模型
    knn_clf=joblib.load("knn_clf")

在这里插入图片描述
改进的KNN代码

    #改进的KNN
    from sklearn.neighbors import NearestNeighbors,KNeighborsClassifier
    #衡量指标
    from sklearn.metrics import accuracy_score,recall_score,f1_score
    
    models=[]
    #n_neighbors指定邻居的数量
    models.append(("KNN",KNeighborsClassifier(n_neighbors=3)))
    
    for clf_name,clf in models:
        clf.fit(X_train,Y_train)
        #下标为0是(X_train,Y_train);下标为1是(X_validation,Y_validation);
        #下标为2是(X_test,Y_test)
        xy_lst=[(X_train,Y_train),(X_validation,Y_validation),(X_test,Y_test)]
        for i in range(len(xy_lst)):
            #i=0即训练集,i=1即验证集,i=2即测试集
            x_part=xy_lst[i][0]
            y_part=xy_lst[i][1]
            y_prd=clf.predict(x_part)
            
            print(i)
            print(clf_name,"-ACC:",accuracy_score(y_part,y_prd))
            print(clf_name,"REC:",recall_score(y_part,y_prd))
            print(clf_name,"F_Score:",f1_score(y_part,y_prd)) 
    

在这里插入图片描述

(2)朴素贝叶斯——适合离散数据

在这里插入图片描述
举例:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值