2019-07-08 12:01:23 qq_43958076 阅读数 64
  • 实时数据分析实践分享

    在多变化的移动互联网时代, 能有效抓住大量用户的数据, 并进行分析, 改善客户体验, 增加用户黏性, 一值都是大数据分析重要的课题。以往我们会利用Hadoop作批次大数据后处理分析, 到现在越来越多需求想要更实时作数据流分析。

    4369 人正在学习 去看看 庄富任

一谈到大数据技术,很多人首先想到的是数学,大概是因为数字在数学体系中稳固的位置吧,这也是理所当然的。大数据时代已经被抄的很热了,这个行业目前已经逐渐成熟,想学习大数据开发的人越来越多。每天我们在互联网都要存留大量的信息,但如何收集、整理这海量的信息,并产生价值,已经是各行各业都在探索的重要课题,且不说在海量数据中挖掘用户需求,预测未来的市场导向,就连政府的政务数据也要云计算、大数据。.

大数据需要哪些技术?

想要学好大数据需掌握以下技术:

1. Java编程技术

学习大数据需要熟练掌握的技术(干货)

 

今天为大家整理了部分大数据学习教程与大家共享,每个人可以根据自己的需要来选择,需要的小伙伴可以+下学习资料分享裙 199加上427最后是210数字连起来就是了。

 


大数据的未来前景可期,入行的人也非常的多,而如何快速的完成转型,如何快速的进入大数据领域,就需要转型者、小白去进行深刻的思考。
 

随着需求的增长,数据的重点也在以同样的速度增长。今年以来,大数据的主要趋势围绕企业的大数据能力发展。移动应用程序开发人员正在寻找以更快的速度精确分析更多数据的最佳方法。大数据已经成为在最初投资中获得成功的技术。因此,许多移动应用程序开发商和大公司都期待着扩大他们的大数据项目。大数据实施的目标是在不久的将来取得更大的财务业绩。

只有完整的学完以上技术,才能算得上大数据开发人才,真正从事大数据开发相关工作,工作才更有底气,升职加薪不成问题!

2019-06-04 10:13:55 yyyyyyyyyooi 阅读数 534
  • 实时数据分析实践分享

    在多变化的移动互联网时代, 能有效抓住大量用户的数据, 并进行分析, 改善客户体验, 增加用户黏性, 一值都是大数据分析重要的课题。以往我们会利用Hadoop作批次大数据后处理分析, 到现在越来越多需求想要更实时作数据流分析。

    4369 人正在学习 去看看 庄富任

一谈到大数据技术,很多人首先想到的是数学,大概是因为数字在数学体系中稳固的位置吧,这也是理所当然的。大数据时代已经被抄的很热了,这个行业目前已经逐渐成熟,想学习大数据开发的人越来越多。每天我们在互联网都要存留大量的信息,但如何收集、整理这海量的信息,并产生价值,已经是各行各业都在探索的重要课题,且不说在海量数据中挖掘用户需求,预测未来的市场导向,就连政府的政务数据也要云计算、大数据。.

如果有编程背景这是最好的了,会节省很多学习时间,更容易理解。因为大数据环境比较复杂,并不像学习编程软件一样,机器安装一下,跟老师敲几行代码就可以了,但大数据可就要麻烦多了,至少要准备好虚拟化的集群环境,然后又要安装部署各种计算框架,所以需要有耐心,有一定解决问题的能力,坚持不懈,才有可能学好大数据。

由于工作关系,在我的周围存在这两类人,一是正在学校学习的大学生,二是在IT公司从事研发设计的工程师。他们在数学学习和应用方面出现了两个极端。在校大学生,特别是大一、大二的学生每学期都有一些诸如数学分析、线性代数、数论之类数学课程,尽管在课堂上可以听到莱布尼茨和牛顿的纠葛故事、笛卡尔的爱情故事,但是他们往往感到很迷茫,因为不知道所学的数学知识到底有什么用。对于IT公司的研发人员来说,他们在进入大数据相关岗位前,总是觉得要先学点数学,但是茫茫的数学世界,哪里才是大数据技术的开头?

线性代数这部分数学知识与大数据技术开发的关系也很密切,矩阵、转置、秩 分块矩阵、向量、正交矩阵、向量空间、特征值与特征向量等在大数据建模、分析中也是常用的技术手段。

在互联网大数据中,许多应用场景的分析对象都可以抽象成为矩阵表示,大量Web页面及其关系、微博用户及其关系、文本集中文本与词汇的关系等等都可以用矩阵表示。比如对于Web页面及其关系用矩阵表示时,矩阵元素就代表了页面a与另一个页面b的关系,这种关系可以是指向关系,1表示a和b之间有超链接,0表示a,b之间没有超链接。著名的PageRank算法就是基于这种矩阵进行页面重要性的量化,并证明其收敛性。

【大数据开发学习资料领取方式】:加入大数据技术学习交流群458345782,点击加入群聊,私信管理员即可免费领取

以矩阵为基础的各种运算,如矩阵分解则是分析对象特征提取的途径,因为矩阵代表了某种变换或映射,因此分解后得到的矩阵就代表了分析对象在新空间中的一些新特征。所以,奇异值分解SVD、PCA、NMF、MF等在大数据分析中的应用是很广泛的。

课程主要介绍大数据中的数学基础:

一、向量、矩阵介绍 

二、向量在游戏引擎中的应用

三、矩阵奇异值分解及其应用 

四、导数、梯度介绍 

五、最优化方法及其应用

 

2014-03-11 13:31:41 tianshi_1105 阅读数 1510
  • 实时数据分析实践分享

    在多变化的移动互联网时代, 能有效抓住大量用户的数据, 并进行分析, 改善客户体验, 增加用户黏性, 一值都是大数据分析重要的课题。以往我们会利用Hadoop作批次大数据后处理分析, 到现在越来越多需求想要更实时作数据流分析。

    4369 人正在学习 去看看 庄富任


    近日,数据科学家陈继东(皮东)正式加入支付宝,就任支付宝大数据安全研究中心。皮东将研究利用大数据预测支付中的安全趋势,这也是大数据研究方向中的前沿课题。


    此前,皮东曾任原EMC中国研究院大数据实验室负责人,从事大数据管理和分析,用户行为建模与分析等研究工作。而加入支付宝之后,研究方向为数据驱动的支付安全与风险识别,主要关注从传统的账户密码验证方法向基于海量用户行为分析和预测的账户风险识别方法变革。


    据了解,支付宝大数据安全研究中心旨在利用账户设备环境属性及账户行为等数据构建多维立体虚拟网络,从账户安全与账户行为之间寻找风险的蛛丝马迹,从传统的风险机构“事后堵截”的手段转变为“预先识别”。最新的课题包括研究iPhone新品发布与账户被盗群体的联系等。


    “用户使用现金支付很少留下可供分析的数据,但现在人们普遍使用手机支付,理清这些信息可以让我们更好地透过操作了解真实意图,还原用户的需求。我们将多维度分析这些数据,尝试让风险控制力量提前介入,从链条源头把握支付安全,大数据在这方面有非常大的潜力。”皮东表示。


    支付宝大数据安全研究中心已有十多位浙大、清华、香港科技大学等高校博士,综合了Paypal、EMC、IBM等全球顶尖企业的大数据经验。连同400多人的风险控制团队,与1132台支付安全服务器一起,每天分析超过2.4亿个账户的行为,最终实现资金损失率低于0.001%。与此同时还与业内厂商合作,共同屏蔽了全球39%的电子商务钓鱼网站,每周基本上拦截5000个钓鱼网站。安全防控水平高于国际同行。


    陈继东为中国人民大学计算机应用博士,于2012年底加入中国计算机学会大数据专家委员会,研究兴趣包括大规模数据管理和分析,移动数据分析及应用,用户行为分析和信息检索等。


【敬请添加微信公众帐号:数据堂 微信号:datatang】

2018-04-06 21:50:42 silencehhh 阅读数 1416
  • 实时数据分析实践分享

    在多变化的移动互联网时代, 能有效抓住大量用户的数据, 并进行分析, 改善客户体验, 增加用户黏性, 一值都是大数据分析重要的课题。以往我们会利用Hadoop作批次大数据后处理分析, 到现在越来越多需求想要更实时作数据流分析。

    4369 人正在学习 去看看 庄富任

天池精准医疗大赛——人工智能辅助糖尿病遗传风险预测

一直想做一个天池大数据方面的比赛,以前一直没时间,正逢糖尿病风险预测比赛,阿里举办的,课题比较喜欢,哈哈
这里写图片描述
这里写图片描述

进入天池大数据竞赛中心,就可以看到相关信息以及数据,下载下来即可对其作分析。
这里写图片描述

打开其中的train列表,我们可以发现,每一个病例都有41个特征,外加“”血糖“”预测,如下图所示:
这里写图片描述
这里写图片描述

特征工程:
接下来对表格中的数据进行分析下,看看是不是有什么缺省值,数据不足的地方

数据总览:

import numpy as np
import pandas as pd
# 数据路径
data_path = 'E:\The_most_powerful_laboratory\Tianchi_bigData\AI_diabetes_prediction\The_program_and_Result\Tianchi_data\\'
# 选用pandas导入训练集,测试集
df_train = pd.read_csv(data_path+'d_train_20180102.csv') 
df_test_A = pd.read_csv(data_path+'d_test_A_20180102.csv')  
df_test_B = pd.read_csv(data_path+'d_test_B_20180128.csv') 
df_test_A_answer = pd.read_csv(data_path+'d_answer_a_20180128.csv',header=-1)

id 性别 年龄 体检日期 天门冬氨酸氨基转换酶 丙氨酸氨基转换酶 *碱性磷酸酶 *r-谷氨酰基转换酶 \
0 1 男 41 12/10/2017 24.96 23.10 99.59 20.23
1 2 男 41 19/10/2017 24.57 36.25 67.21 79.00
2 3 男 46 26/10/2017 20.82 15.23 63.69 38.17
3 4 女 22 25/10/2017 14.99 10.59 74.08 20.22
4 5 女 48 26/10/2017 20.07 14.78 75.79 22.72
5 6 女 74 18/10/2017 23.72 22.59 81.23 23.35
6 7 男 31 21/09/2017 24.97 25.53 109.03 65.42
7 8 男 55 21/09/2017 37.32 40.03 88.49 25.15
8 9 男 39 16/10/2017 21.70 39.17 102.91 67.09
9 10 女 35 10/10/2017 18.89 15.79 78.21 25.75
10 11 男 47 13/10/2017 27.33 35.76 80.26 84.97
11 12 男 50 10/10/2017 22.89 28.46 77.54 48.16
12 13 女 48 19/10/2017 30.11 34.70 92.67 16.39
13 14 女 36 11/10/2017 16.82 11.80 67.79 13.16
14 15 女 37 27/09/2017 24.58 24.64 96.43 27.79
15 16 女 43 28/09/2017 20.07 14.81 72.11 33.98
16 17 男 77 24/10/2017 18.49 17.29 104.91 41.33
17 18 男 42 16/10/2017 24.71 30.26 95.70 37.97
18 19 男 39 30/10/2017 31.44 43.97 92.58 35.84
19 20 男 38 28/09/2017 23.58 31.19 102.16 44.01
20 21 男 30 29/09/2017 33.25 67.19 82.22 59.91
21 22 男 51 26/10/2017 26.53 20.44 67.03 25.84
22 23 女 38 19/10/2017 24.13 34.02 77.32 18.78
23 24 女 33 30/09/2017 15.77 11.43 95.86 20.45
24 25 女 28 20/10/2017 20.24 12.55 61.90 7.99
25 26 女 34 30/10/2017 20.89 16.16 102.40 14.69
26 27 男 34 30/10/2017 32.03 52.74 102.73 34.53
27 28 男 38 31/10/2017 34.62 54.43 119.68 51.14
28 29 男 60 24/10/2017 28.36 32.30 64.43 30.76
29 30 男 55 17/10/2017 29.60 34.07 99.96 41.95
… .. .. … … … … …
5612 5702 女 35 10/10/2017 16.88 12.60 78.18 24.35
5613 5703 女 50 10/10/2017 NaN NaN NaN NaN
5614 5705 女 29 10/10/2017 NaN NaN NaN NaN
5615 5706 男 38 10/10/2017 40.69 58.04 89.89 41.94
5616 5707 女 35 10/10/2017 15.74 11.71 71.85 15.52
5617 5708 男 33 10/10/2017 41.57 59.92 92.58 49.45
5618 5709 男 30 10/10/2017 17.13 21.95 82.48 40.98
5619 5710 女 66 10/10/2017 22.87 15.43 118.00 14.62
5620 5711 男 38 10/10/2017 29.46 48.27 79.34 80.79
5621 5712 男 45 10/10/2017 17.99 18.75 114.87 18.60
5622 5713 女 36 10/10/2017 26.21 28.14 57.07 33.75
5623 5714 男 35 10/10/2017 22.22 27.43 87.09 27.03
5624 5715 女 50 10/10/2017 29.68 19.82 77.52 11.96
5625 5716 女 38 10/10/2017 20.52 14.13 66.78 15.26
5626 5717 女 41 10/10/2017 16.75 9.77 65.03 10.86
5627 5718 女 50 10/10/2017 20.36 25.00 118.56 38.07
5628 5719 男 40 10/10/2017 45.84 38.42 80.96 123.39
5629 5720 女 30 10/10/2017 23.38 27.63 58.79 6.95
5630 5721 女 42 10/10/2017 18.59 19.43 68.40 16.63
5631 5722 女 36 10/10/2017 22.08 4.62 51.76 16.76
5632 5723 男 27 10/10/2017 61.34 160.58 88.69 27.16
5633 5724 女 58 10/10/2017 29.09 26.26 90.07 17.65
5634 5725 男 60 10/10/2017 31.06 24.52 80.09 26.18
5635 5726 男 41 10/10/2017 20.92 18.63 67.25 53.71
5636 5727 男 34 10/10/2017 28.72 36.22 36.09 26.72
5637 5728 女 47 10/10/2017 18.82 14.56 54.02 14.75
5638 5729 女 31 10/10/2017 21.08 13.07 76.03 13.80
5639 5730 女 80 10/10/2017 22.95 21.51 106.37 32.88
5640 5731 女 55 10/10/2017 33.54 24.94 97.60 19.16
5641 5732 女 30 10/10/2017 21.37 20.77 52.54 26.94

   *总蛋白    白蛋白  ...    血小板计数  血小板平均体积  血小板体积分布宽度  血小板比积  中性粒细胞%  淋巴细胞%  \

0 76.88 49.60 … 166.0 9.9 17.4 0.164 54.1 34.2
1 79.43 47.76 … 277.0 9.2 10.3 0.260 52.0 36.7
2 86.23 48.00 … 241.0 8.3 16.6 0.199 48.1 40.3
3 70.98 44.02 … 252.0 10.3 10.8 0.260 41.7 46.5
4 78.05 41.83 … 316.0 11.1 14.0 0.350 56.6 33.1
5 76.46 45.85 … 249.0 8.5 17.0 0.211 42.9 47.0
6 80.82 46.40 … 246.0 10.8 13.3 0.270 52.9 32.0
7 74.17 41.63 … 282.0 10.5 13.0 0.300 52.8 36.9
8 76.12 49.31 … 275.0 9.8 11.4 0.270 53.1 35.9
9 75.94 46.64 … 247.0 10.7 12.6 0.270 65.6 27.3
10 75.84 43.71 … 178.0 10.8 13.5 0.190 54.0 35.7
11 73.80 48.32 … 259.0 10.3 12.0 0.270 57.8 33.1
12 77.86 43.05 … 223.0 12.4 17.2 0.280 38.8 48.5
13 76.84 47.56 … 330.0 9.2 9.9 0.300 72.5 20.5
14 92.31 46.98 … 344.0 11.9 15.5 0.410 57.5 33.4
15 74.43 44.49 … 424.0 10.7 12.7 0.450 64.9 28.5
16 76.02 42.39 … 303.0 9.9 11.5 0.300 73.0 17.5
17 81.87 43.85 … 263.0 11.4 16.1 0.300 55.0 35.8
18 79.74 46.49 … 274.0 11.2 13.4 0.310 61.5 28.2
19 81.50 51.16 … 193.0 11.2 13.6 0.220 54.4 36.8
20 82.80 49.32 … 256.0 11.6 16.2 0.300 58.4 33.7
21 75.70 48.68 … 166.0 9.9 17.2 0.164 58.2 33.9
22 76.12 44.87 … 571.0 10.1 10.1 0.580 55.9 27.6
23 83.11 47.37 … 196.0 11.5 14.2 0.230 45.8 47.4
24 76.97 47.89 … 206.0 10.4 11.5 0.210 49.0 44.1
25 77.07 43.72 … 293.0 11.8 15.4 0.350 55.4 39.2
26 79.11 50.40 … 264.0 9.4 10.0 0.250 56.1 35.4
27 78.47 49.26 … 223.0 11.1 15.1 0.250 55.1 33.1
28 71.38 43.21 … 201.0 10.5 11.4 0.210 54.2 35.8
29 82.33 45.49 … 260.0 11.1 13.5 0.290 55.7 30.1
… … … … … … … … …
5612 79.14 46.91 … 329.0 9.9 11.7 0.330 59.6 30.7
5613 NaN NaN … 261.0 11.5 13.7 0.300 50.7 39.6
5614 NaN NaN … 279.0 10.5 11.9 0.290 62.9 30.3
5615 76.02 46.37 … 293.0 11.3 15.2 0.330 50.4 37.1
5616 80.56 46.81 … 319.0 9.5 10.6 0.300 70.6 22.1
5617 85.35 50.51 … 283.0 10.0 11.8 0.280 54.3 36.1
5618 79.63 48.26 … 300.0 10.6 13.9 0.320 46.8 31.3
5619 74.49 42.25 … 254.0 11.7 14.6 0.300 71.1 21.5
5620 72.87 47.46 … 225.0 9.8 12.2 0.220 53.5 33.8
5621 74.89 45.32 … 183.0 11.1 14.8 0.200 51.4 39.5
5622 75.40 45.74 … 200.0 11.6 14.4 0.230 65.2 27.9
5623 79.83 49.72 … 254.0 9.5 10.2 0.240 59.0 30.6
5624 80.54 45.98 … 379.0 11.3 16.4 0.430 53.0 37.1
5625 81.55 46.94 … 344.0 10.0 11.5 0.340 52.8 23.9
5626 68.42 42.54 … 295.0 10.4 11.8 0.310 70.2 22.2
5627 79.70 48.24 … 289.0 11.4 14.5 0.330 59.3 29.1
5628 84.03 49.40 … 162.0 11.7 16.0 0.190 57.1 28.5
5629 76.54 44.48 … 255.0 10.6 12.2 0.270 55.6 37.7
5630 70.17 42.34 … 240.0 9.4 9.4 0.220 73.0 20.3
5631 78.62 45.23 … 226.0 10.4 11.9 0.240 57.7 35.5
5632 76.65 48.27 … 234.0 10.4 12.0 0.240 67.5 25.3
5633 75.50 39.84 … 225.0 10.2 12.1 0.230 49.9 39.9
5634 72.44 45.90 … 248.0 10.6 12.3 0.260 57.6 33.7
5635 82.12 44.65 … 276.0 11.7 14.8 0.320 35.3 56.8
5636 69.07 46.54 … 225.0 11.2 13.3 0.250 58.2 31.5
5637 77.44 44.27 … 200.0 10.6 12.0 0.210 48.8 43.3
5638 80.72 47.21 … 210.0 11.1 13.7 0.230 60.6 31.3
5639 75.29 40.43 … 323.0 10.4 12.6 0.340 61.1 30.1
5640 78.50 43.10 … 220.0 12.2 16.3 0.270 55.0 36.9
5641 79.86 49.25 … 367.0 9.9 10.8 0.360 58.5 31.2

  单核细胞%  嗜酸细胞%  嗜碱细胞%     血糖  

0 6.5 4.7 0.6 6.06
1 5.8 4.7 0.8 5.39
2 7.7 3.2 0.8 5.59
3 6.7 4.6 0.5 4.30
4 9.1 0.6 0.6 5.42
5 7.1 2.1 1.0 5.97
6 11.3 3.1 0.7 5.11
7 6.6 2.8 0.9 5.94
8 7.3 3.3 0.4 5.66
9 5.4 1.0 0.7 5.48
10 8.1 1.3 0.9 4.44
11 7.5 1.2 0.4 5.48
12 7.2 4.2 1.3 5.32
13 6.1 0.6 0.3 5.08
14 6.8 1.5 0.8 4.63
15 5.0 1.1 0.5 4.92
16 7.2 1.9 0.4 7.08
17 8.0 1.0 0.2 4.66
18 6.0 3.5 0.8 6.58
19 7.1 1.3 0.4 4.29
20 5.3 2.0 0.6 4.55
21 5.2 2.4 0.3 5.16
22 11.5 4.3 0.7 5.13
23 5.3 1.1 0.4 4.37
24 5.5 0.8 0.6 5.17
25 4.5 0.3 0.6 4.64
26 6.8 1.1 0.6 5.82
27 9.1 1.9 0.8 6.29
28 7.5 1.7 0.8 5.10
29 10.4 2.6 1.2 5.41
… … … …
5612 7.8 1.2 0.7 5.32
5613 7.6 1.6 0.5 5.63
5614 5.2 1.1 0.5 4.84
5615 8.9 2.5 1.1 5.44
5616 5.9 1.0 0.4 4.79
5617 6.5 2.5 0.6 4.82
5618 6.0 15.1 0.8 5.25
5619 5.6 1.1 0.7 4.71
5620 8.8 2.8 1.1 6.64
5621 8.3 0.5 0.3 5.56
5622 5.7 0.5 0.7 5.07
5623 8.5 1.3 0.6 5.60
5624 8.5 0.5 0.9 5.32
5625 3.8 18.4 1.1 5.40
5626 5.5 1.2 0.9 5.39
5627 9.0 2.2 0.4 17.43
5628 6.6 7.2 0.6 5.52
5629 4.8 1.4 0.5 5.29
5630 5.7 0.9 0.1 5.43
5631 5.3 0.9 0.6 5.58
5632 6.1 0.8 0.3 5.18
5633 4.8 4.8 0.6 5.25
5634 7.4 1.0 0.3 5.15
5635 5.7 1.7 0.5 6.01
5636 7.2 2.7 0.4 5.11
5637 6.5 0.7 0.7 5.45
5638 5.5 1.6 1.0 5.13
5639 6.0 2.2 0.6 5.24
5640 6.8 0.7 0.6 6.37
5641 5.8 3.7 0.8 6.00

其他数据也可以查看,发现,数据之中存在空数据,除此之外,还存在字符类型的数据,如性别特征中的男女,这不利于做数据分析以及后续的预测,所以,第一步对数据进行处理

print( "\n为 LightGBM 进行 数据处理工作······" )
def make_feature_lightgbm(train,test):
    """将train 和 test中的id列的值给复制出来,赋值给 train_id,test_id"""
    train_id = train.id.values.copy()
    test_id = test.id.values.copy()
    """将train 和test 两个dataframe进行拼接起来"""
    data = pd.concat([train,test])
    """将原始数据中的性别“男”替换为0,“女” 替换为1,缺失替换为0,数据文件在“dataset”文件夹下"""
    data['性别'] = data['性别'].map({'男':1,'女':0})
    """将日期转换为 天数,方便后续计算,或者是删除 """
    data['体检日期'] = (pd.to_datetime(data['体检日期']) - parse('2016-10-09')).dt.days  
    """按列提取均值,并填入NAN位置,inplace=True表示不显示处理结果,False为显示处理结果"""
    data.fillna(data.median(axis=0),inplace=True)
    """改变格式,float64-->> float32"""
    for c, dtype in zip(data.columns, data.dtypes):
        if dtype == np.float64:
            data[c] = data[c].astype(np.float32)
    """
    上面的操作都是为了对数据进行处理,之前合并数据是为了简化操作
    重新切割 data,分为 训练特征和测试特征
    """
    train_feat = data[data.id.isin(train_id)]
    test_feat = data[data.id.isin(test_id)]
    return train_feat,test_feat

df_train,df_test= make_feature_lightgbm(train,test)

通过上述代码片,可以得出训练集和测试集

import lightgbm as lgb
"""将训练数据中的id 和 血糖 两列删除掉,赋值给 x_train"""
x_train = df_train.drop(['id', '血糖'], axis=1)  
"""y_train 训练标签"""
y_train = df_train['血糖'].values  # array([6.06, 5.39, 5.59, ..., 5.24, 6.37, 6.  ], dtype=float32)
#print(x_train.shape, y_train.shape)  #(5642, 40) (5642,)
"""列出表格中的所有标题栏"""
train_columns = x_train.columns  
"""
   x_train.dtypes=float32
   x_train.dtypes == object   false
   下面这个循环只是用来检查是否存在columns中存在非object的名称
"""
for c in x_train.dtypes[x_train.dtypes == object].index.values:
    x_train[c] = (x_train[c] == True) 
"""Python垃圾回收机制:gc模块  解决内存泄露问题"""
#del df_train; gc.collect()
"""change x_train 的type 由 DataFrame 变为 float32 """
x_train = x_train.values.astype(np.float32, copy=False) 
"""将数据集导入lgb函数当中,包括训练数据,以及对应的标签"""
d_train = lgb.Dataset(x_train, label=y_train)

这里选用了GBDT、XGBoost、LightGBM三种,提升方法,是将多个专家的判断进行适当的综合所得出的判断,要比其中任何一个专家单独的判断好,具体可以去官方文档

将数据导入lgb函数中后,设置lgb相关参数

params = {}
params['max_bin'] = 10
params['learning_rate'] = 0.0021 # shrinkage_rate
params['boosting_type'] = 'gbdt'
params['objective'] = 'regression'
params['metric'] = 'mse'          # or 'mae'
params['sub_feature'] = 0.345    # feature_fraction (small values => use very different submodels)
params['bagging_fraction'] = 0.85 # sub_row
params['bagging_freq'] = 40
params['num_leaves'] = 512        # num_leaf
params['min_data'] = 500         # min_data_in_leaf
params['min_hessian'] = 0.05     # min_sum_hessian_in_leaf
params['verbose'] = 0
params['feature_fraction_seed'] = 2
params['bagging_seed'] = 3

"""np.random.seed(0)的作用:作用:使得随机数据可预测"""
np.random.seed(0)
random.seed(0)
print("\nFitting LightGBM model ...")

clf = lgb.train(params, d_train, 1000)

使用lgb进行训练之后,得到clf训练模型,这时可以对模型进行检测

"""内存泄露,垃圾回收"""
#del d_train; gc.collect()
#del x_train; gc.collect()

print("\n准备基于LightGBM的预测 ...")
print("  准备测试数据 x_test...")
x_test = df_test.drop(['id','血糖'], axis=1)
print("\n开始进行 LightGBM 预测...")
p_test = clf.predict(x_test)

得到测试结果,对其进行输出以及存储结果

"""内存泄露,垃圾回收"""
#del x_test; gc.collect()

print( "LightGBM 预测:" )
print( pd.DataFrame(p_test))
result_path = 'E:\The_most_powerful_laboratory\Tianchi_bigData\AI_diabetes_prediction\The_program_and_Result\\'
pd.DataFrame(p_test).to_csv(result_path+'other_treat2_pm_lgb.csv',header=None,index=False)

输出结果:
0 5.980362
1 6.152404
2 5.434784
3 5.691541
4 5.347017
5 5.498835
6 5.450368
7 5.708111
8 5.867635
9 6.118506
10 5.080957
11 5.692060
12 5.879674
13 5.575080
14 5.941833
15 5.108654
16 5.479026
17 5.761566
18 5.215997
19 5.928394
20 5.431442
21 5.487162
22 6.361659
23 6.106310
24 5.917645
25 5.250482
26 5.293484
27 5.484452
28 5.699167
29 5.661823
.. …
970 5.736628
971 6.044788
972 6.120981
973 6.290797
974 5.643984
975 5.629949
976 5.896866
977 5.884388
978 5.552906
979 5.099668
980 6.094184
981 5.207230
982 5.878387
983 5.592142
984 6.070533
985 5.723010
986 5.697837
987 6.142087
988 6.066210
989 5.785511
990 5.848041
991 5.250853
992 5.340729
993 6.106734
994 6.380849
995 5.595592
996 5.968682
997 6.036769
998 5.314922
999 5.549087

预测完毕
做了一次比赛之后发现,这种数据比赛的重点在于 特征工程的处理,特征的优良好坏,很大程度上决定了你预测结果的好坏,当然,好的预测方法也是十分关键的。机器学习时代三大神器GBDT、XGBoost、LightGBM,不同种的将会决定你预测的精度和速度。

好了,结束了(给自己一个小目标,每周一篇博客,贵在坚持)

PS:本次代码,十分注重基本库的运用,如pandas,lgb库等,特别是pandas,俗话说得好,pandas大法好;另外,贴上我的GitHub完整代码地址。新人,请多多指正

2019-07-11 11:17:59 qq_43610161 阅读数 284
  • 实时数据分析实践分享

    在多变化的移动互联网时代, 能有效抓住大量用户的数据, 并进行分析, 改善客户体验, 增加用户黏性, 一值都是大数据分析重要的课题。以往我们会利用Hadoop作批次大数据后处理分析, 到现在越来越多需求想要更实时作数据流分析。

    4369 人正在学习 去看看 庄富任

一.数据背景及问题描述

  1. 数据来源:课题来源于天池大赛,数据来源于中国人民大学中国调查与数据中心《中国综合社会调查(CGSS)》项目,为多阶分层抽样的截面面访调查。
  2. 研究背景:在社会科学领域,幸福感的研究占有重要的位置。这个涉及了哲学、心理学、社会学、经济学等多方学科的话题复杂而有趣;同时与大家生活息息相关,每个人对幸福感都有自己的衡量标准。如果能发现影响幸福感的共性,生活中是不是将多一些乐趣;如果能找到影响幸福感的政策因素,便能优化资源配置来提升国民的幸福感。目前社会科学研究注重变量的可解释性和未来政策的落地,主要采用了线性回归和逻辑回归的方法,在收入、健康、职业、社交关系、休闲方式等经济人口因素;以及政府公共服务、宏观经济环境、税负等宏观因素上有了一系列的推测和发现。
  3. 研究目标:使用公开数据的问卷调查结果,选取其中多组变量,包括个体变量(性别、年龄、地域、职业、健康、婚姻与政治面貌等等)、家庭变量(父母、配偶、子女、家庭资本等等)、社会态度(公平、信用、公共服务等等),来预测其对幸福感的评价。

二.描述性统计

1. 数据介绍
1.1 标签介绍
数据集的标签是happiness变量,是一个取值为1到5的有序变量,表示幸福程度。数值越大表示幸福感越强,1表示感到非常不幸福,5表示非常幸福。
1.2 特征介绍
数据集中一共有139个特征,大致可以分为两类:第一类是与自身相关的,第二类是
与自身家庭相关的。第一类中与自身相关的可以大致细分为3个方面:第一方面是外在,比如出生日期、性别、身高、体重、身体健康状况等;第二方面是精神认知方面,比如是否有信仰宗教、社会公平度、对社会各项公共的满意程度等,第三方面主要是经济方面、比如过去现在以及将来所处社会等级、工作收入等。第二类是家庭基本信息,比如父母亲配偶的年龄、工作、政治面貌等。
2. 描述性统计
#查看数据的总体情况,可以看出共有140个变量,其中的happiness为标签变量

data.info(verbose=True,null_counts=True)

2.1 标签
发现数据存在12个异常值,由于12占整体的数据量较少,此处描述性统计暂时不统计标签小于0的值,对结果影响不大,后续预处理将对标签进行处理 统计标签大于0 的分布从标签饼图可以看出觉得幸福的人最多,占样本的60.3%,其次是非常幸福的人,占样本的17.7%,感到非常不幸福的人较少仅占1.3%

label=data['happiness']
label.value_counts
colors=['steelblue','#ff9999','#7777aa','pink','#dd5555']
label_list=[]
label_c=[]
for i in range(1,6):
    label_list.append(data.loc[label==i,'happiness'].count())
plt.pie(label_list,labels=[1,2,3,4,5],autopct='%.1f%%',colors=colors)
plt.legend()

在学生这里插入图片描述
2.2个人信息描述
在这里插入图片描述

#样本类型查看
data['survey_type'].value_counts()

在这里插入图片描述
从样本类型的统计看出,城市中的样本占大多数。作出不同类别群体的幸福分布条形图,从图中可以看出两个群体关于幸福感的整体趋势是相同的,但城市类别中,感到特别幸福的人的比例略高于农村地区。

city=data[data['survey_type']==1]
rural=data[data['survey_type']==2]
city_list=[]
rural_list=[]
for i in range(1,6):
    city_list.append(city.loc[city['happiness']==i,'happiness'].count())
    rural_list.append(rural.loc[rural['happiness']==i,'happiness'].count())
width=0.35
plt.bar(range(1,6),city_list,width=width,label='city',color='pink')
plt.bar(np.arange(1,6)+width,rural_list,width=width,label='rural',color='#7777aa')
plt.xticks(np.arange(1,6)+0.1,[1,2,3,4,5])
plt.legend()
plt.show

在这里插入图片描述

**#性别**
sex_list=[]
for i in range(1,3):
    sex_list.append(data.loc[data['gender']==i,'happiness'].count())
plt.pie(sex_list,colors=['#7777aa','pink'],labels=['F','M'],autopct='%.1f%%')
plt.legend()

在这里插入图片描述
性别分布的饼图如上图所示,F代表男性,M代表女性,可以看出女性受访者略多于男性,再做出不同性别的幸福感分布条形图,可看出男女 的幸福感分布走势基本相同,再通过比较均值进一步进行研究,这两个类别幸福感均值的条形图如图,可以看出女性群体的幸福感均值略高于男性。

f=data.loc[data['gender']==1]
m=data[data['gender']==2]
f_list=[]
m_list=[]
for i in range(1,6):
    f_list.append(f.loc[f['happiness']==i,'happiness'].count())
    m_list.append(m.loc[m['happiness']==i,'happiness'].count())
width=0.35
plt.bar(range(1,6),f_list,width=width,label='f',color='pink')
plt.bar(np.arange(1,6)+width,m_list,width=width,label='m',color='#7777aa')
plt.xticks(np.arange(1,6)+0.1,[1,2,3,4,5])
plt.legend()
plt.show

在这里插入图片描述
在这里插入图片描述
#年龄
用出生日期减去调查日期得到受访者的年龄。年龄分布的盒形图如下,从该图可以看出,样本中年龄大的有90多岁,小的不到20岁,大多数受访者年龄为40-60岁。按照幸福程度分组,可以看出组别均值之间存在差异,感到非常幸福的人的年龄均值最大。

#年龄
data['survey_time']=pd.to_datetime(data['survey_time'])
data['survey_year']=data['survey_time'].dt.year
data['age']=data['survey_year']-data['birth']
plt.boxplot(data['age'],patch_artist='pink')

在这里插入图片描述
在这里插入图片描述
#身高
身高箱线图如图,身高最小值不到120cm、最大值超过190cm,有较多离群值。按照幸福感分组得到分组条形图,如图,幸福感为4即感到比较幸福的群体有较多离群值,同时也能看出 该群体的身高均值最大

plt.boxplot(data['height_cm'],patch_artist='pink')

在这里插入图片描述
#体重
体重的箱线图如图。可以看出有较多样本的体重最小的仅有40,有较多小的离群值。体重的单位是斤,考虑到受访者都是成年人,猜想这部分体重小的离群点可能是受访者混淆了单位,填的是以公斤计算的体重。在后续特征处理的时候考虑将体重乘以2。

plt.boxplot(data['weight_jin'],patch_artist='pink')

在这里插入图片描述
#身体健康
身体健康分布的饼图如下图,这是一个顺序变量,1代表很不健康,5代表很健康。可以看出比较健康的人最多,占38.8%,很不健康的人最少,占3.1%。右图反应的是健康各个等级的均值走势图,可以看出健康等级越高的群体,幸福感均值也越大。

health_list=[]
for i in range(1,6):
   health_list.append(data.loc[data['health']==i,'happiness'].count())
plt.pie(health_list,labels=[1,2,3,4,5],autopct='%.1f%%')
plt.legend()
hp=[]
for i in range(1,6):
    hp.append(data.loc[data['health']==i,'happiness'].mean())
plt.plot(range(1,6),hp,color='b',markersize=5,markeredgecolor='r',marker='o',label='health-happiness')
plt.title('不同健康情况的幸福感均值分布')
plt.xlabel('健康状况')
plt.ylabel('幸福等级')
plt.legend()

在这里插入图片描述
在这里插入图片描述
**

2.3精神认知层面

在这里插入图片描述
#教育程度
教育程度的饼图如图,图中数值的含义是:1=没有受过任何教育;2=私塾、扫盲班;3=小学;4=初中;5=职业高中;6=普通高中;7=中专;8=技校;9=成人大学专科;10=正规大学专科;11=成人大学本科;12=正规大学本科;13=研究生即以上;14=其他。从图中可以看出受访者中学历为初中的人最多,其次是小学,都不太高,可能是由于受访者大多数较年长,以前的教育资源较缺乏。右图是各个教育程度的幸福均值折线图,可以看出不同类别之间存在着明显的差异,教育程度为“其他”的幸福感最低,教育程度为2(小学)和13(研究生及以上)的两个群体幸福感较高。

edu=[]
for i in range(1,15):
    edu.append(data.loc[data['edu']==i,'happiness'].count())
plt.pie(edu,labels=np.arange(1,15),autopct='%.1f%%')
plt.legend()

edu_=data[data['edu']>0]
sns.pointplot('edu','happiness',data=edu_)

在这里插入图片描述
在这里插入图片描述
#社会公平
社会公平性是取值1-5的有序变量,数值越大表示越觉得公平,1表示认为社会完全不公平,5表示认为完全。从分布的条形图可以看出绝大多数的看法是4(认为社会较公平)。右图是不同看法群体的均值,可以看出认为社会越公平的群体,幸福感均值也越大。

equ=data[data['equity']>0]
sns.countplot('equity',data=equ)

sns.pointplot('equity','happiness',data=equ)

在这里插入图片描述
在这里插入图片描述
#社交
是取值为1-7的有序变量,取值越低,代表社交频率越频繁。从饼图可以看出,2(很少社交)的人最多,其次是3(有时社交)。条形图是不同社交程度群体的均值,可以看出社交频率高的群体相对于频次较低的群体幸福感均值高。

social=[]
for i in range(1,6):
    social.append(data.loc[data['social_friend']==i,'happiness'].count())
plt.pie(social,labels=range(1,6),autopct='%.1f%%')
plt.legend()

lu=data[data['social_friend']>0]
sns.pointplot('social_friend','happiness',data=lu)

在这里插入图片描述
在这里插入图片描述
#学习充电
这是一个顺序变量,值越大表示课外充电频率越高。可以看出将近一半的人空闲时间从不学习,仅有2.4%的人课外学习频繁。右图是不同学习频率群体的均值,可以看出随着频率的增加,幸福感均值也增加,群体4(经常学习)和群体5(学习非常频繁)两个群体差异较小

learn=[]
for i in range(1,6):
    learn.append(data.loc[data['learn']==i,'happiness'].count())
plt.pie(learn,labels=range(1,6),autopct='%.1f%%')
plt.legend()
plt.title('学习充电分布')

在这里插入图片描述

st=data[data['learn']>0]
sns.pointplot('learn','happiness',data=st)

在这里插入图片描述
#沮丧频繁程度
为取值1-4的顺序变量,值越小表示越频繁。可以看出大多人很少感到沮丧,仅有1.1%的人总是感到沮丧。从折线图可以得知沮丧程度越频繁的群体,幸福感均值也就越低。

de=[]
for i in range(1,6):
    de.append(data.loc[data['depression']==i,'happiness'].count())
plt.pie(de,labels=range(1,6),autopct='%.1f%%')
plt.legend()
plt.title('沮丧程度分布')

在这里插入图片描述

det=data[data['depression']>0]
sns.pointplot('depression','happiness',data=det)

在这里插入图片描述

2.4.社会经济地位

在这里插入图片描述
关于受访者主观认为其所处的社会地位的6个问题中,涉及到多个时间点的信息,以目前所处等级为基准,对其他3个变量进行相减做差并等频分组,可以得到数年来受访者所处等级的变化,可作为新的变量加入特征集,其分布直方图如左下图.
据统计,65.6%的受访者认为当前所处社会等级高于14岁时家庭所处的等级,56.4%的受访者认为当前所处的社会等级高于10年前,89.04%的受访者认为未来10年后的所处等级会不低于现在;

data['now-14']=data['class']-data['class_14']
data['now-class_10_before']=data['class']-data['class_10_before']
plt.hist(data['now-14'])
plt.title('与十四岁对照等级变化分布图')
data.loc[data['now-14']>0,'now-14'].count()/8000

在这里插入图片描述

plt.hist(data['now-class_10_before'])
plt.title('与十年前对照等级变化分布图')
data.loc[data['now-class_10_before']>0,'now-class_10_before'].count()/8000

在这里插入图片描述

data['now-class_10_after']=data['class_10_after']-data['class']
plt.hist(data['now-class_10_after'])
plt.title('与十年后对照等级变化分布图')
data.loc[data['now-class_10_after']>=0,'now-class_10_after'].count()/8000

在这里插入图片描述
2.4.家庭收入
在这里插入图片描述
#收入
对收入进行分组,并统计不同组别对应得幸福感的不同,原始的收入数据分布具有大量极端值,右偏态显著,对其进行5组分组。可以看出,出去少于3000的收入人群,可能为退休老人,退役军官等,幸福感来源有所不同,其他人随着收入的增加,每组的幸福感均值也在增加,可见收入对幸福感有正向支撑作用。

def income_cut(income):
    if income<=3000:
        return 1
    if 3000<income<=8000:
        return 2
    if 8000<income<=15000:
        return 3
    if 15000<income<=35000:
        return 4
    if income>35000:
        return 5
data["income"]=data["income"].map(income_cut)
plt.hist(data['income'])

在这里插入图片描述

sns.pointplot('income','happiness',data=data)

在这里插入图片描述
#房产拥有情况
在拥有房产小于4套时,幸福感随着房产的增多而增加,之后再随房产数量在增多,幸福感反而发生了大的波动,进一步加入性别因素,探究不同性别对于房产的不同感知,可见男女在房产小于4时的幸福感趋势基本相同,相对来说,高数量房产的拥有者多为女性,推测为女强人类型或者为异常值。

data_list=data[data['house']<10]
data_1=data_list[data_list['house']>0]
sns.pointplot('house','happiness',data=data_1)

sns.pointplot('house','happiness',data=data_1,hue='gender',color='r')

在这里插入图片描述
在这里插入图片描述

三.数据预处理

3.1缺失值填补


#去除严重缺失值
data=data.drop(['edu_other','invest_other','join_party','property_other','s_work_status','s_work_type','work_manage','work_status','work_type','work_yr'],axis=1)
#data.info(verbose=True,null_counts=True)

数据缺失值填补-方法1,按照数据分布进行填补
均值填充----数据分布近似正态
中位数填充—数据存在离群点或者偏态分布
众数填充—数据为不分大小的标签值,如男女

data['edu_yr'].describe()
data.loc[data['edu_yr']<0,'edu_yr']=np.NAN
data['edu_yr'].value_counts()
plt.hist(data['edu_yr'].dropna())
#发现被调查者取得毕业证年份呈明显的右偏分布,因此可以取中位数进行缺失值填补
data['edu_yr']=data['edu_yr'].fillna(data['edu_yr'].median())
data['edu_status']=data['edu_status'].fillna(data['edu_status'].median())

在这里插入图片描述
缺失值处理–方法2
插值法填充,使用缺失值前一个和后一个的平均数

data['social_neighbor'] = data['social_neighbor'].interpolate()
data['social_friend'] = data['social_friend'].interpolate()

缺失值处理-方法3
随机森林填充 随机森林,指的是利用多棵树对样本进行训练并预测的一种分类器。该分类器最早由Leo Breiman和Adele Cutler提出。简单来说,是一种bagging的思想,采用bootstrap,生成多棵树,CART(Classification And Regression Tree)构成的。对于每棵树,它们使用的训练集是从总的训练集中有放回采样出来的,这意味着,总的训练集中的有些样本可能多次出现在一棵树的训练集中,也可能从未出现在一棵树的训练集中。对于一个有n行的数据集,out of bag 的概率大概是1/e=1/3。n趋向无穷大的时候,(1-1/n)^n~1/e。

理解上这个1/n是每次抽样的比率吗?所以out of bag到底是什么意思?

1.在与其它现有的算法相比,其预测准确率很好 2.在较大的数据集上计算速度依然很快 3.不需要降维,算法本身是采取随机降维的 4.他能处理有缺失值的数据集。算法内部有补缺失值的函数 5.能给出变量的重要性 6.能处理imbalanced data set 7.能给出观测实例间的相似度矩阵,其实就是proximity啦,继而能做clustering 和 location outlier 8.能对unlabeled data 进行无监督的学习,进行clustering 9.生成的森林可以保留,应用在新的数据集上

#目前的缺失列"hukou_loc","family_income","minor_child","marital_1st","s_birth","marital_now","s_edu","s_political","s_hukou","s_income","s_work_exper"
list=["hukou_loc","family_income","minor_child","marital_1st","s_birth","marital_now","s_edu","s_political","s_hukou","s_income","s_work_exper"]
from sklearn.ensemble import RandomForestClassifier
for i in list:
    re=data[data[i].notnull()]
    rn=data[data[i].isnull()]
    re_x=re[["province","gender","religion","edu","political","floor_area","health","hukou","son","daughter","status_peer","public_service_1"]].astype(float)
    re_y=re[i].astype(float)
    rn_x=rn[["province","gender","religion","edu","political","floor_area","health","hukou","son","daughter","status_peer","public_service_1"]].astype(float)
    model=RandomForestClassifier()
    model.fit(re_x,re_y)
    pr=model.predict(rn_x)
    data.loc[data[i].isnull(),i]=pr

3.2.异常值处理

#异常值处理
index_abnormal_weight = data.loc[data.weight_jin<70].index
for i in index_abnormal_weight :
    if data["gender"].iloc[i]==1:
        data["weight_jin"].iloc[i]=data["weight_jin"].iloc[i]*2
    if data["gender"].iloc[i]==2:
        if (data["height_cm"].iloc[i]>140) or (data["health"].iloc[i]>2):
            data["weight_jin"].iloc[i]=data["weight_jin"].iloc[i]*2 
data["weight_jin"].describe()
data.loc[data['income']<0,'income']=0

3.3.离散化处理

#离散化处理
#income
def income_cut(income):
    if income<=3000:
        return 1
    if 3000<income<=8000:
        return 2
    if 8000<income<=15000:
        return 3
    if 15000<income<=35000:
        return 4
    if income>35000:
        return 5
data["income"]=data["income"].map(income_cut)
data["s_income"]=data["s_income"].map(income_cut)
data["family_income"]=data["family_income"].map(income_cut)
data["inc_exp"]=data["inc_exp"].map(income_cut)
#处理时间特征
data['survey_time']=pd.to_datetime(data['survey_time'])
data['survey_year']=data['survey_time'].dt.year
#问卷年龄
data['age']=data['survey_year']-data['birth']
data['age'].describe()
def age_cut(birth):
    if birth<=18:
        return 1
    if 18<birth<=25:
        return 2
    if 25<birth<=40:
        return 3
    if 40<birth<=60:
        return 4
    if birth>60:
        return 5 
data['age']=data['age'].map(age_cut)
#出生年代
data['birth'].describe()
def birth_cut(birth):
    if birth<=1940:
        return 1
    if 1940<birth<=1955:
        return 2
    if 1955<birth<=1970:
        return 3
    if 1970<birth<=1985:
        return 4
    if birth>1985:
        return 5  
data['birth']=data['birth'].map(birth_cut)
data['edu_yr']=data['edu_yr'].map(birth_cut)
data["s_birth"]=data["s_birth"].map(birth_cut)
data["s_birth"]=data["s_birth"].map(birth_cut)
data["marital_1st"]=data["marital_1st"].map(birth_cut)
data["marital_now"]=data["marital_now"].map(birth_cut)

#房屋面积分组
def floor(x):
    if 0<=x<=50:
        return 1
    elif  50<x<=100:
        return 2
    elif  100<x<=200:
        return 3
    elif  200<x<=400:
        return 4
    elif  x>400:
        return 5
data["floor_area"]=data["floor_area"].map(floor)
#身高分组
def height(x):
    if x<=130:
        return 1
    elif  130<x<=150:
        return 2
    elif  150<x<=170:
        return 3
    elif  170<x<=190:
        return 4
    elif  x>190:
        return 5
data["height_cm"]=data["height_cm"].map(height)
#体重分组
def weight(x):
    if x<=70:
        return 1
    elif  70<x<=90:
        return 2
    elif  90<x<=110:
        return 3
    elif  110<x<=150:
        return 4
    elif  x>150:
        return 5
data["weight_jin"]=data["weight_jin"].map(weight)

#社会公共服务分组
def service(x):
    if x<10:
        return 0
    elif  10<=x<30:
        return 1
    elif  30<x<=50:
        return 2
    elif  50<x<70:
        return 3
    elif  70<x<90:
        return 4
    else:
        return 5
data["public_service_1"]=data["public_service_1"].map(service)
data["public_service_2"]=data["public_service_2"].map(service)
data["public_service_3"]=data["public_service_3"].map(service)
data["public_service_4"]=data["public_service_4"].map(service)
data["public_service_5"]=data["public_service_5"].map(service)
data["public_service_6"]=data["public_service_6"].map(service)
data["public_service_7"]=data["public_service_7"].map(service)
data["public_service_8"]=data["public_service_8"].map(service)
data["public_service_9"]=data["public_service_9"].map(service)
#提取标签 并去除无关变量

y=data['happiness']
data=data.drop(["id"], axis=1)
data=data.drop(["happiness"], axis=1)
data=data.drop(["survey_time"], axis=1)
data=data.drop(["property_0"], axis=1)
#对标签异常值进行处理
y.describe()
y[y<0]=y.median()
#去除异常值多的变量
data=data.drop(["f_birth"], axis=1)
data=data.drop(["m_birth"], axis=1)
#对省份按照区域进行重新划分
data['province'].describe()
def pro(province):
    if province in [1,15,9,10,19,24]:
        return 1
    if province in [12,13,20]:
        return 2
    if province in [21,22,18,16]:
        return 3
    if province in [4,7,17,11,3]:
        return 4
    if province in [8,14,30,29,23]:
        return 5
    if province in [6,2,26,25,28]:
        return 6
    if province in [27,5,31]:
        return 7
    
data['province']=data['province'].map(pro)

3.4.独热编码
需要进行独热编码的有宗教,性别,省份,政治身份,户口,户口所在地等

from sklearn.preprocessing import OneHotEncoder
category_name=["survey_type","gender","religion","nationality","political",
                "hukou","hukou_loc","province"]
category_feature=data[category_name]
category_feature
enc=OneHotEncoder(categories="auto")
category_feature=enc.fit_transform(category_feature).toarray()
category_feature=pd.DataFrame(category_feature)
data=pd.concat([data,category_feature],axis=1)
data.drop(category_name,axis=1)

3.5.特征选择
特征选择 模型在预处理后仍有176个变量,因此我们使用随机森林对特征进行选取,并对特征的重要性进行排序 可以看出对幸福感影响最大的前十个变量分别是社会地位,户口所在地,房产拥有,健康状况,沮丧程度等
用有抽样放回的方法(bootstrap)从样本集中选取n个样本作为一个训练集,用抽样得到的样本集生成一棵决策树。在生成的每一个结点:随机不重复地选择d个特征,利用这d个特征分别对样本集进行划分,找到最佳的划分特征(可用基尼系数、增益率或者信息增益判别)。重复步骤1到步骤2共k次,k即为随机森林中决策树的个数。用训练得到的随机森林对测试样本进行预测,并用票选法决定预测的结果。 用随机森林进行特征重要性评估的思想就是看看每个特征在随机森林中的每颗树上做了多大的贡献,然后取平均值,最后比较特征之间的贡献大小。

data=pd.DataFrame(data)
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import SelectFromModel
import matplotlib.pyplot as plt
import numpy as np
from plotly.graph_objs import *
from plotly.offline import init_notebook_mode, iplot
#定义一个由500颗决策树组成的随机森林模型
rf_model = RandomForestClassifier(n_estimators=500,max_depth=5,random_state=0,n_jobs=-1)
#训练
rf_model.fit(data,y)
#获取特征的重要性
importances = rf_model.feature_importances_
#对特征的重要性进行排序
indices = np.argsort(importances)[::-1]
cols_name = data.columns[1:]
for f in range(10):
    print("%2d) %-*s %f" % (f + 1,30,cols_name[indices[f]],importances[indices[f]]))
plt.figure(figsize=(10, 8))
plt.title("特征的重要性")
plt.bar(range(data.shape[1]),importances[indices],color="lightblue",align="center")
plt.xticks(range(data.shape[1]),cols_name)
plt.xlim([-1,data.shape[1]])
plt.show()
model = SelectFromModel(rf_model, prefit=True)
data= model.transform(data)
data.shape

在这里插入图片描述

四.模型建立

#模型拟合
#进行k折交叉验证下的xgboost回归
from sklearn.metrics import accuracy_score
from xgboost.sklearn import XGBRegressor
from sklearn.metrics import mean_squared_error
from sklearn.externals import joblib
from sklearn.model_selection import KFold
from sklearn.metrics import roc_curve,roc_auc_score,confusion_matrix
data=pd.DataFrame(data)
kfold = KFold(n_splits=10, shuffle = True, random_state= 11)
model = XGBRegressor(base_score=0.5, booster='gbtree', colsample_bylevel=0.1,
       colsample_bytree=0.971, gamma=0.11, learning_rate=0.069, max_delta_step=0,
       max_depth=4, min_child_weight=1, missing=None, n_estimators=300,
       n_jobs=-1, nthread=50, objective='reg:linear', random_state=0,
       reg_alpha=0.1, reg_lambda=1, scale_pos_weight=1, seed=None,
       silent=True, subsample=1.0)
mse = []
auc=[]
i = 0
for train, test in kfold.split(data):
    x_train = data.iloc[train]
    y_train = y.iloc[train]
    x_test = data.iloc[test]
    y_test = y.iloc[test]

    model.fit(x_train,y_train)
    y_pred = model.predict(x_test)
    y_test= pd.DataFrame(y_test)
    xg_mse = mean_squared_error(y_true=y_test,y_pred=y_pred)
    predictions = [round(value) for value in y_pred]
    accuracy = accuracy_score(y_test, predictions)
    mse.append(xg_mse)
    auc.append(accuracy)
    print("mean squared_error",xg_mse)
    print("accuracy",accuracy)
    joblib.dump(filename="xg"+str(i),value=model)
    i+=1
print("xgboost-mean squared_error",np.mean(mse))

在这里插入图片描述

五.结果分析

对于幸福感的预测,我们尝试多次后发现准确率很难再进行提升,可能原因有:

个人对于幸福感的定义不同。因此,结合自身条件对自己的幸福感级别做定义,作为我们的预测标签,这本身就处于不同的标准之上,即两个不同的人,都对自己的幸福感评级为3级,但3级对于有些人而言算比较幸福,对有些人而言并不能算得上比较幸福,因此这种个别差异导致幸福感很难用相同的标准去预测每个人。
其次,影响不同人的幸福感因素不同,也有可能有些影响人幸福感的因素并未纳入调查变量中,导致预测精度较低。
存在更加适合预测的模型或者模型的参数有待进一步调优。

预测模型项目模板

阅读数 419

没有更多推荐了,返回首页