估算收入阶层

实验内容

本节将根据14个属性建立分类器评估一个人的收入等级。可能的输出类型是“高于50K”和“低 于或等于50K”。这个数据集稍微有点复杂,里面的每个数据点都是数字和字符串的混合体。数值 数据是有价值的,在这种情况下,不能用标记编码器进行编码。需要设计一套既可以处理数值数 据,也可以处理非数值数据的系统。我们将用美国人口普查收入数据集中的数据: https://archive.ics.uci.edu/ml/datasets/Census+Income 。

知识链接

  1. 分类与上一章介绍的回归不同,回归的输出结果是实数。监督学习分类器就是用带标记的训练数据建立一个模型, 然后对未知数据进行分类。
  2. 在真实世界中,分类器可以是非常复杂的形式。在学习过程中,可以看到二元(binary)分类器,将数据分 成两类,也可以看到多元(multiclass)分类器,将数据分成两个以上的类型。解决分类问题的数 据手段都倾向于解决二元分类问题,可以通过不同的形式对其进行扩展,进而解决多元分类问题。
  3. 朴素贝叶斯是一类比较简单的算法,scikit-learn中朴素贝叶斯类库的使用也比较简单。相对于决策树,KNN之类的算法,朴素贝叶斯需要关注的参数是比较少的,这样也比较容易掌握。在scikit-learn中,一共有3个朴素贝叶斯的分类算法类。分别是GaussianNB,MultinomialNB和BernoulliNB。其中GaussianNB就是先验为高斯分布的朴素贝叶斯,MultinomialNB就是先验为多项式分布的朴素贝叶斯,而BernoulliNB就是先验为伯努利分布的朴素贝叶斯。
  4. 一般来说,如果样本特征的分布大部分是连续值,使用GaussianNB会比较好。如果如果样本特征的分大部分是多元离散值,使用MultinomialNB比较合适。而如果样本特征是二元离散值或者很稀疏的多元离散值,应该使用BernoulliNB。
  5. 最后使用交叉验证检验模型准确性,避免出现欠拟合和过拟合的现象
  6. 当处理机器学习模型时,通常关心3个指标:精度(precision)、召回率(recall)和F1得分(F1 score)。可以用参数评分标准(parameter scoring)获得各项指标的得分。精度是指被分类器正确分类的样本数量占分类器总分类样本数量 的百分比(分类器分类结果中,有一些样本分错了)。召回率是指被应正确分类的样本数量占某 分类总样本数量的百分比(有一些样本属于某分类,但分类器却没有分出来)。
  7. 一个给力的机器学习模型需要同时具备良好的精度和召回率。这两个指标是二律背反的,一 个指标达到100%,那么另一个指标就会非常差!我们需要保持两个指标能够同时处于合理高度。 为了量化两个指标的均衡性,引入了F1得分指标,是精度和召回率的合成指标,实际上是精度和 召回率的调和均值(harmonic mean):F1 得分=2×精度×召回率 / (精度+召回率)

详细步骤

# 导入相关的包
import numpy as np
from sklearn import preprocessing
from sklearn.naive_bayes import GaussianNB
from sklearn import model_selection# 加载数据集
input_file = "adult.data.txt"
X = []
y = []
count_lessthan50k = 0  # 统计收入<=50k的人数
count_morethan50k = 0  # 统计收入>50k的人数
num_images_threshold = 10000
'''
我们将使用数据集中的20 000个数据点——每种类型10 000个,保证初始类型没有偏差。
在模型训练时,如果你的大部分数据点都属于一个类型,那么分类器就会倾向于这个类型。因此,
最好使用每个类型数据点数量相等的数据进行训练:
'''
with open(input_file, 'r') as f:for line in f.readlines():if '?' in line:continuedata = line[:-1].split(', ')   # 将每一行数据放到一个列表当中if data[-1] == '<=50K' and count_lessthan50k < num_images_threshold:X.append(data)count_lessthan50k += 1elif data[-1] == '>50K' and count_morethan50k < num_images_threshold:X.append(data)count_morethan50k += 1if count_lessthan50k >=num_images_threshold and count_morethan50k >= num_images_threshold:breakX = np.array(X)# 标记编码
label_encoder = []
X_encoded = np.empty(X.shape)
for i,item in enumerate(X[0]):if item.isdigit():X_encoded[:, i] = X[:, i]  # 如果这个属性本身就是数值,那么直接不需要标记编码,原封不动即可!!else:label_encoder.append(preprocessing.LabelEncoder())X_encoded[:, i] = label_encoder[-1].fit_transform(X[:, i])X = X_encoded[:, :-1].astype(int)
y = X_encoded[:, -1].astype(int)# 创建分类器
classifier_gaussiannb = GaussianNB()
classifier_gaussiannb.fit(X, y)# 把数据分割成训练数据集和测试数据集,方便后面获取性能指标:
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.25, random_state=5)
classifier_gaussiannb = GaussianNB()
classifier_gaussiannb.fit(X_train, y_train)
y_test_pred = classifier_gaussiannb.predict(X_test)# 交叉验证
# 计算分类器的F1得分
f1 = model_selection.cross_val_score(classifier_gaussiannb,X, y, scoring='f1_weighted', cv=5)
print("F1 score: " + str(round(100*f1.mean(), 2)) + "%")# 使用单一的数据示例进行测试
input_data = ['39', 'State-gov', '77516', 'Bachelors', '13', 'Never-married', 'Adm-clerical', 'Not-in-family', 'White', 'Male', '2174', '0', '40', 'United-States']
count = 0
input_data_encoded = [-1] * len(input_data)
for i,item in enumerate(input_data):if item.isdigit():input_data_encoded[i] = int(input_data[i])else:input_data_encoded[i] = int(label_encoder[count].transform([input_data[i]]))count = count + 1input_data_encoded = np.array(input_data_encoded)
input_data_encoded = input_data_encoded.reshape(1, len(input_data))# 打印单一的数据示例的预测结果
output_class = classifier_gaussiannb.predict(input_data_encoded)
print(label_encoder[-1].inverse_transform(output_class)[0])  # 使用inverse_transform函数进行标记解码

源代码+数据集

链接:https://pan.baidu.com/s/19ModMp40DEny30F5h_Z-Pg
提取码:evyn
复制这段内容后打开百度网盘手机App,操作更方便哦

实验结果

机器学习(五)贝叶斯分类器之估算收入阶层相关推荐

  1. 机器学习(五)---贝叶斯分类器算法总结

    1. 综述 1.1贝叶斯分类器 贝叶斯决策论是概率框架下实施决策的基本方法.对分类任务来说,在所有概率都已经知道的理想情况下,贝叶斯决策论考虑如何基于这些概率和误判损失来选择最优的类别标记. 具体的说 ...

  2. 【火炉炼AI】机器学习013-用朴素贝叶斯分类器估算个人收入阶层

    [火炉炼AI]机器学习013-用朴素贝叶斯分类器估算个人收入阶层 (本文所使用的Python库和版本号: Python 3.5, Numpy 1.14, scikit-learn 0.19, matp ...

  3. 朴素贝叶斯分类器之分类实操

    python 朴素贝叶斯分类器之分类实操 基本概念 鲁棒性 Huber从稳健统计的角度系统地给出了鲁棒性3个层面的概念: 1.是模型具有较高的精度或有效性,这也是对于机器学习中所有学习模型的基本要求: ...

  4. 【机器学习】贝叶斯分类器【下】

    主要来自周志华<机器学习>一书和博主nebulaf91的原创博客,包含自己的理解. 有任何的书写错误.排版错误.概念错误等,希望大家包含指正. 由于字数限制,分成两篇博客. [机器学习]贝 ...

  5. 朴素贝叶斯分类器之天气预测算法

    朴素贝叶斯分类器之天气预测算法 1.1 题目的主要研究内容 (1)根据天气情况预测要不要去打网球 1.2 题目研究的工作基础或实验条件

  6. 实验五 贝叶斯分类器(模式识别与机器学习)

    目录 实验一  离散型数据的朴素贝叶斯分类 实验步骤: NBtrain.m NBtest.m main.m 实验二  连续型数据的朴素贝叶斯分类 实验步骤: naiveBayestrain.m nav ...

  7. 机器学习之贝叶斯分类(python实现)

    朴素贝叶斯(Naive Bayesian)是最为广泛使用的分类方法,它以概率论为基础,是基于贝叶斯定理和特征条件独立假设的分类方法. 原理 朴素贝叶斯(Naive Bayesian)是基于贝叶斯定理和 ...

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

    一.     问题描述 每个人都希望自己能获得更高的收入,而影响收入高低的因素有很多,能否通过大数据分析来找出对收入影响相对较大的因素? 二.     研究意义 如果我们知道对收入高低起决定性的作用, ...

  9. 从零开始学习机器学习五:决策树算法特征工程

    决策树&特征工程 目标 1 简介 1.1 认识决策树 2 分类原理 2.1 熵 2.2 决策树的划分依据一-信息增益 2.3 决策树的划分依据二-信息增益率 2.4 决策树的划分依据三-基尼值 ...

最新文章

  1. 大作文十大必背范文:五星级真题
  2. oj contest ranklist时间怎么算的_几次买入基金怎么算持有天数,加仓算在原来持有时间吗...
  3. Windows 驱动开发资源链接
  4. 桌面虚拟化之运维支持
  5. 500w 的引用类型和值类型到底有多大差异?
  6. C#中引用第三方ocx控件引发的问题以及解决办法
  7. python单词统计、给定一个段落()_自己动手Python写一个词频统计小项目
  8. 干货 | 我可以读哪些论文来跟上现代NLP的最新趋势?
  9. BZOJ2194: 快速傅立叶之二 (FFT)
  10. windows 进程学习
  11. 读计算机专业买什么笔记本电脑好?你算问对人了
  12. CAN笔记(4) 协议基本概念
  13. 判断是否为回文——判断用户输入的字符串是否为回文。回文是指正反拼写形式都是一样的词,譬如“racecar”。
  14. 蚂蚁金服java二面_蚂蚁金服Java开发二面
  15. 白帽SEO与黑帽SEO的区别
  16. 荣耀10手机计算机科学计算器,荣耀赵明回应手机计算器10%问题:国外计算小费使用...
  17. windows系统的备份和还原
  18. 一个C#开发者用Java搭建Android框架的心路历程
  19. 解决win10系统文件资源管理器一直未响应的问题
  20. linux内核测试指南 第一章

热门文章

  1. 惠普HP LaserJet Pro M15a 打印机驱动
  2. 运行内存那么大怎么清理
  3. 通过集成第三方IM实现聊天应用
  4. 线性代数 线性相关与线性表示的理解
  5. python爬虫 — 爬取淘宝商品信息
  6. 智能坐便器雷达感应技术,微波雷达感应模组应用,雷达传感器方案
  7. FireFox必备插件(二)
  8. uni-app checkbox和switch组件checked属性无效的解决方案
  9. 上海亚商投顾:创业板指高开高走 ChatGPT概念卷土重来
  10. JAVAWeb开发:Tomcat出现The origin server did not find a current representation for the target reso...的问题