机器学习实例--预测美国人口收入状况

一.     问题描述

每个人都希望自己能获得更高的收入,而影响收入高低的因素有很多,能否通过大数据分析来找出对收入影响相对较大的因素?

二.     研究意义

如果我们知道对收入高低起决定性的作用,或者哪些因素组合在一起也能增大收入的可能性,那可以帮助很多人少走弯路,朝着正确的方向努力,早日达到目标。

三.     数据预处理

1.  选取数据集

本报告选取“adult”数据集,由美国人口普查数据集库抽取而来。

该数据集类变量为年收入是否超过50k,属性变量包含年龄,工种,学历,职业,人种等14个属性变量,其中有7个类别型变量。共有30000多条数据。

2.  预处理

由于capital-gain、capital-loss属性缺失70%以上的数据,所以选择删去这两个属性。

在其他类变量中,有缺少或异常属性400多条,占总数据比重较小,也选择删去。

四.     数据可视化

1.workclass

2.education

3.race

4.sex

5.marital-status

五.     算法选取与实现

本次报告中选用决策树算法。决策树是一种依托决策而建立起来的一种树。在机器学习中,决策树是一种预测模型,代表的是一种对象属性与对象值之间的一种映射关系,每一个节点代表某个对象,树中的每一个分叉路径代表某个可能的属性值,而每一个叶子节点则对应从根节点到该叶子节点所经历的路径所表示的对象的值。决策树仅有单一输出,如果有多个输出,可以分别建立独立的决策树以处理不同的输出。

由于数据量过大,普通决策树不能达到预期效果,所以再用预剪枝进行处理。预剪枝是在决策树生成过程中,在划分节点时,若该节点的划分没有提高其在训练集上的准确率,则不进行划分。

下面是预剪枝决策树程序

1. 计算数据集的基尼系数

def calcGini(dataSet):
    numEntries=len(dataSet)
    labelCounts={}
    #给所有可能分类创建字典
    for featVec in dataSet:
        currentLabel=featVec[-1]
        if currentLabel not in labelCounts.keys():
            labelCounts[currentLabel]=0
        labelCounts[currentLabel]+=1
    Gini=1.0
    #以2为底数计算香农熵
    for key in labelCounts:
        prob = float(labelCounts[key])/numEntries
        Gini-=prob*prob
    return Gini

2. 对离散变量划分数据集,取出该特征取值为value的所有样本

def splitDataSet(dataSet,axis,value):
    retDataSet=[]
    for featVec in dataSet:
        if featVec[axis]==value:
            reducedFeatVec=featVec[:axis]
            reducedFeatVec.extend(featVec[axis+1:])
            retDataSet.append(reducedFeatVec)
    return retDataSet

3. 对连续变量划分数据集,direction规定划分的方向,决定是划分出小于value的数据样本还是大于value的数据样本集

def splitContinuousDataSet(dataSet,axis,value,direction):
    retDataSet=[]
    for featVec in dataSet:
        if direction==0:
            if featVec[axis]>value:
                reducedFeatVec=featVec[:axis]
                reducedFeatVec.extend(featVec[axis+1:])
                retDataSet.append(reducedFeatVec)
        else:
            if featVec[axis]<=value:
                reducedFeatVec=featVec[:axis]
                reducedFeatVec.extend(featVec[axis+1:])
                retDataSet.append(reducedFeatVec)
    return retDataSet

4. 选择最好的数据集划分方式

def chooseBestFeatureToSplit(dataSet,labels):
    numFeatures=len(dataSet[0])-1
    bestGiniIndex=100000.0
    bestFeature=-1
    bestSplitDict={}
    for i in range(numFeatures):
        featList=[example[i] for example in dataSet]
        #对连续型特征进行处理
        if type(featList[0]).__name__==‘float‘ or type(featList[0]).__name__==‘int‘:
            #产生n-1个候选划分点
            sortfeatList=sorted(featList)
            splitList=[]
            for j in range(len(sortfeatList)-1):
                splitList.append((sortfeatList[j]+sortfeatList[j+1])/2.0)

            bestSplitGini=10000
            slen=len(splitList)
            #求用第j个候选划分点划分时,得到的信息熵,并记录最佳划分点
            for j in range(slen):
                value=splitList[j]
                newGiniIndex=0.0
                subDataSet0=splitContinuousDataSet(dataSet,i,value,0)
                subDataSet1=splitContinuousDataSet(dataSet,i,value,1)
                prob0=len(subDataSet0)/float(len(dataSet))
                newGiniIndex+=prob0*calcGini(subDataSet0)
                prob1=len(subDataSet1)/float(len(dataSet))
                newGiniIndex+=prob1*calcGini(subDataSet1)
                if newGiniIndex<bestSplitGini:
                    bestSplitGini=newGiniIndex
                    bestSplit=j
            #用字典记录当前特征的最佳划分点
            bestSplitDict[labels[i]]=splitList[bestSplit]

            GiniIndex=bestSplitGini
        #对离散型特征进行处理
        else:
            uniqueVals=set(featList)
            newGiniIndex=0.0
            #计算该特征下每种划分的信息熵
            for value in uniqueVals:
                subDataSet=splitDataSet(dataSet,i,value)
                prob=len(subDataSet)/float(len(dataSet))
                newGiniIndex+=prob*calcGini(subDataSet)
            GiniIndex=newGiniIndex
        if GiniIndex<bestGiniIndex:
            bestGiniIndex=GiniIndex
            bestFeature=i
    #若当前节点的最佳划分特征为连续特征,则将其以之前记录的划分点为界进行二值化处理
    #即是否小于等于bestSplitValue
    #并将特征名改为 name<=value的格式
    if type(dataSet[0][bestFeature]).__name__==‘float‘ or type(dataSet[0][bestFeature]).__name__==‘int‘:
        bestSplitValue=bestSplitDict[labels[bestFeature]]
        labels[bestFeature]=labels[bestFeature]+‘<=‘+str(bestSplitValue)
        for i in range(shape(dataSet)[0]):
            if dataSet[i][bestFeature]<=bestSplitValue:
                dataSet[i][bestFeature]=1
            else:
                dataSet[i][bestFeature]=0
    return bestFeature

5. 特征若已经划分完,节点下的样本还没有统一取值,则需要进行投票

def majorityCnt(classList):
    classCount={}
    for vote in classList:
        if vote not in classCount.keys():
            classCount[vote]=0
        classCount[vote]+=1
    return max(classCount)

6.由于在Tree中,连续值特征的名称以及改为了  feature<=value的形式,因此对于这类特征,需要利用正则表达式进行分割,获得特征名以及分割阈值

def classify(inputTree,featLabels,testVec):
    firstStr=list(inputTree.keys())[0]
    if ‘<=‘ in firstStr:
        featvalue=float(re.compile("(<=.+)").search(firstStr).group()[2:])
        featkey=re.compile("(.+<=)").search(firstStr).group()[:-2]
        secondDict=inputTree[firstStr]
        featIndex=featLabels.index(featkey)
        if testVec[featIndex]<=featvalue:
            judge=1
        else:
            judge=0
        for key in secondDict.keys():
            if judge==int(key):
                if type(secondDict[key]).__name__==‘dict‘:
                    classLabel=classify(secondDict[key],featLabels,testVec)
                else:
                    classLabel=secondDict[key]
    else:
        secondDict=inputTree[firstStr]
        featIndex=featLabels.index(firstStr)
        for key in secondDict.keys():
            if testVec[featIndex]==key:
                if type(secondDict[key]).__name__==‘dict‘:
                    classLabel=classify(secondDict[key],featLabels,testVec)
                else:
                    classLabel=secondDict[key]
    return classLabel

def testing(myTree,data_test,labels):
    error=0.0
    for i in range(len(data_test)):
        if classify(myTree,labels,data_test[i])!=data_test[i][-1]:
            error+=1
    print (‘myTree %d‘ %error)
    return float(error)

def testingMajor(major,data_test):
    error=0.0
    for i in range(len(data_test)):
        if major!=data_test[i][-1]:
            error+=1
    print (‘major %d‘ %error)
    return float(error)

7.主程序,递归产生决策树

def createTree(dataSet,labels,data_full,labels_full,data_test):
    classList=[example[-1] for example in dataSet]
    if classList.count(classList[0])==len(classList):
        return classList[0]
    if len(dataSet[0])==1:
        return majorityCnt(classList)
    temp_labels=copy.deepcopy(labels)
    bestFeat=chooseBestFeatureToSplit(dataSet,labels)
    bestFeatLabel=labels[bestFeat]
    myTree={bestFeatLabel:{}}
    if type(dataSet[0][bestFeat]).__name__==‘str‘:
        currentlabel=labels_full.index(labels[bestFeat])
        featValuesFull=[example[currentlabel] for example in data_full]
        uniqueValsFull=set(featValuesFull)
    featValues=[example[bestFeat] for example in dataSet]
    uniqueVals=set(featValues)
    del(labels[bestFeat])
    #针对bestFeat的每个取值,划分出一个子树。
    for value in uniqueVals:
        subLabels=labels[:]
        if type(dataSet[0][bestFeat]).__name__==‘str‘:
            uniqueValsFull.remove(value)
        myTree[bestFeatLabel][value]=createTree(splitDataSet         (dataSet,bestFeat,value),subLabels,data_full,labels_full,         splitDataSet(data_test,bestFeat,value))
    if type(dataSet[0][bestFeat]).__name__==‘str‘:
        for value in uniqueValsFull:
            myTree[bestFeatLabel][value]=majorityCnt(classList)
    #进行测试,若划分没有提高准确率,则不进行划分,返回该节点的投票值作为节点类别

    if testing(myTree,data_test,temp_labels)<testingMajor(majorityCnt(classList),data_test):
        return myTree
    return majorityCnt(classList)

六.     结果分析

1. 未剪枝决策树

2. 预剪枝决策树

原文地址:https://www.cnblogs.com/yue-guan/p/adult1072.html

时间: 2024-10-19 07:27:17

机器学习实例--预测美国人口收入状况的相关文章

如何快速部署一个机器学习在线预测系统

七牛的自定义数据处理平台提供高性能 GPU 计算机群及自动伸缩容器集群方便开发者对云存储中的大量图片/音视频/文档数据进行云端机器学习,包括图像分类.视频分析.语音识别以及自然语言处理等等.简单易用的自定义数据处理平台可以帮助开发者快速构建机器学习应用,实现在云端进行训练.分类和预测. 本文介绍如何使用七牛自定义数据处理平台快速部署一个机器学习在线预测系统.主要分为以下三个步骤: 第一步:构建机器学习应用容器镜像 第二步:在平台上注册及部署机器学习应用 第三步:使用机器学习系统在线预测 前期准备

UCI 人口收入数据分析(python)

一.项目介绍 UCI上有许多免费的数据集可以拿来练习,可以在下面的网站找寻 http://archive.ics.uci.edu/ml/datasets.html 这次我使用的是人口收入调查,里面会有每个人的教育程度.每周工时.职业.性别等数据,并以50K为界线,分为收入大于50K和收入小于50K的人群. 首先利用pandas将数据抓下,由于数据是在网页上,直接抓网页就可以,并且用table的格式,以逗号区分列,由于原始数据没有列名称,所以需要为每列设定一个名称,下面为代码 import pan

利用Microsoft Azure Machine Learning Studio创建机器学习实例

Microsoft Azure云服务推出机器学习的模块,用户只需上传数据,利用机器学习模块提供的一些算法接口和R语言或别的语言接口,就能利用Microsoft Azure强大的云计算能力来实现自己的机器学习的任务. 本文浅尝了该机器学习模块,参照官方实例和帮助文档,完成了一个简单的应用实例,具体步骤如下. 1.新建workspace 注意,在填写workspace owner,一定要填写一个有效的windows live 账号 进入创建的workspace,界面如下图所示 2.上传数据 数据源:

python好书推荐:【A028】[异步图书].Python机器学习:预测分析核心算法

Python机器学习:预测分析核心算法pdf获取方式:点这里 请注意,本并没有直接告诉薇姬,他认为她是一个具有奉献精神和坚定信念的人.然而,对于薇姬来说,她不难承认自己具备这些特征,也很容易将其应用于自己的工作中.即使薇姬认为自己并不具备奉献精神和坚定信念,也无损这种新关系.Python机器学习:预测分析核心算法. 不管薇姬的自我评价如何,本说的都是实话,所以他的观点在最坏的情况下则会被忽视,在最好的情况下则会促使薇姬对自己(和本)感觉良好.基于人的本性,即便薇姬在现实中并不具有奉献精神和坚定信

【机器学习实践二】人口普查统计

产品地址:https://data.aliyun.com/product/learn?spm=a21gt.99266.416540.102.OwEfx2 一.背景 感谢大家关注玩转数据系列文章,我们希望通过在阿里云机器学习平台上提供demo数据并搭建相关的实验流程的方式来帮助大家学习如何通过算法来挖掘数据中的价值.本系列文章包含详细的实验流程以及相关的文档教程,欢迎大家进入阿里云数加机器学习平台体验.实验案例请在新建实验页签查看,如下图. 本章作为玩转数据系列的开篇,先提供一个简单的案例给大家热

R语言使用机器学习算法预测股票市场

quantmod 介绍 quantmod 是一个非常强大的金融分析报, 包含数据抓取,清洗,建模等等功能. 1. 获取数据 getSymbols 默认是数据源是yahoo 获取上交所股票为 getSymbols("600030.ss"), 深交所为 getSymbols("000002.sz").  ss表示上交所, sz表示深交所 2. 重命名函数 setSymbolLookup 3. 股息函数 getDividends 4. 除息调整函数 adjustOHLC

8行代码预测中国人口

现在关于中国人口增长的问题火热的很,我们不妨来预测预测,顺便拿刚学的Python练练手 我们首先看一下2010年人口普查的结果,网址如下:http://www.docin.com/p-710316652.html 2010年人口年龄结构如下: 0-4岁:0.69亿 5-9岁:0.7亿 10-14岁:0.83亿 15-19岁:1.1亿 20-24岁:1.25亿 25-29岁:1.1亿 30-34岁:0.94亿 35-39岁:1.26亿 40-44岁:1.16亿 45-49岁:0.81亿 50-54

《机器学习实战》学习笔记:Logistic回归&amp;预测疝气病证的死亡率

前言: 生活中,人们经常会遇到各种最优化问题,比如如何在最短时间从一个地点到另外一个地点?如何在投入最少的资金而却能得到最高的受益?如何设计一款芯片使其功耗最低而性能最好?这一节就要学习一种最优化算法--Logistic回归,设计最优化算法的目的依然是用于分类.在这里,Logistic回归的主要思想是根据现有的数据对分类边界线建立回归公式,达到分类的目的.假设我们有一堆数据,需要划一条线(最佳直线)对其分类,这就是Logistic回归的目的. 而"Logistic回归"中的"

关于机器学习的十个实例

机器学习是什么? 机器学习是什么?这个问题的答案可以参考权威的机器学习定义,但是实际上,机器学习是由它所解决的问题定义的.因此,理解机器学习最好的方式是观察一些实例. 首先来看一些现实生活中众所周知和理解的机器学习问题的实例,然后讨论标准的机器学习问题的分类(命名系统),学习如何辨别一个问题是属于哪种标准案例.这样做的意义是,了解所面对的问题类型,我们就可以思考所需要的数据和可尝试的算法. 机器学习问题的十个实例 机器学习问题到处都是,它们组成了日常使用的网络或桌面软件的核心或困难部分.推特上“