0.数据预处理

数据清洗

数据清洗是指发现并纠正数据文件中可识别的错误的最后一道程序,包括检查数据一致性,处理无效值和缺失值等。

将训练集(单独清洗),测试集、correct_ans(合并后清洗)

washdata函数要做的几件事:0.将测试数据与correct_ans合并(行拼接,以下简称合并集),并将合并后的列名‘label’改为‘income’,将训练集的‘income’列赋予布尔值1.删除训练集与合并集中的‘?’行,并将它们的性别列赋予布尔值2.单独取出income列(将原有数据income列删除)3.特征缩放

0.0将测试数据与correct_ans合并(行拼接,以下简称合并集),并将合并后的列名‘label’改为‘income’,将训练集的‘income’列赋予布尔值

import csvimport numpy as np
import pandas as pddef washData(datapath1, datapath2='nothing'):df_x = pd.read_csv(datapath1)  # 读取训练集/测试集if datapath2 != 'nothing':# 输入的文件包括测试集和correct_ans时,进行合并之后再清洗:washData('test.csv', 'correct_answer.csv')df_correct_ans = pd.read_csv(datapath2)  # 读取correct_ans.csvdf_x = pd.concat([df_x, df_correct_ans['label']],axis=1)  # 将训练集与correct_ans进行行连接,注意correct_ans的index不能用数字(df_x为字典形式)# 测试集中为14列(没有income列)df_x.rename(columns={'label': 'income'},inplace=True)  # 由于训练集中标签名为‘income’,correct_ans中标签为'label',因此需要转换:label→income# df_x: age,workclass,fnlwgt  ... hours_per_week,native_country,income    [16281 rows x 15 columns](14+1)else:# 输入的文件只有训练集时,进行单独清洗:washData(‘train.csv')df_x['income'] = (df_x['income'] == ' >50K')  # 将训练集中income列赋予布尔值(>50K赋予1,否则为0)注意‘ >50k’中有空格# 将训练集/测试集与corret——ans合并后的数据进行清洗

注意:‘ >50k’,’ male’中有空格,否则结果有误

0.1.删除训练集与合并集中的‘?’行,并将它们的性别列赋予布尔值

 df_x = df_x.replace('?', np.nan)  # 将‘?’换成nandf_x = df_x.dropna()  # 删除带有空值的行,只要有一个空值,就删除整行# 这里要将测试集与correct_ans合并后的数据进行数据清洗,否则它们的数据将不再对应df_x['sex'] = (df_x['sex'] == 'Male')  # 将df_x中的性别赋予布尔值#     da_x是一个dataframe,有行标签列标签,而series只有行标签

0.2.单独取出income项并将原数据中的income删除

    data_y = df_x[['income']].astype(np.int64)  # 这里df_[[]]双重括号保证data_y仍是dataframe类型,单括号则转为series类型,int64是numpy特有的数据类型,不同于python的intdel df_x['income']#     将数据分为数字和非数字object_columns = [col for col in df_x.columns ifdf_x[col].dtypes == 'object']  # 列表解析式。提取出非数字的列名称:判断每一列的数据中是否全为object类型,是则提取列名no_object_columns = [col for col in df_x.columns if df_x[col].dtypes == 'int64']  # 提取数字类型列名(有一个不为数字则不提取)object_data = df_x[object_columns]  # object_data包含df_x的所有object_columns列no_object_data = df_x[no_object_columns]object_data = pd.get_dummies(object_data)  # 将非文字转换为虚拟变量#     合并数据集data_x = pd.concat([no_object_data, object_data], axis=1)data_x = data_x.astype(np.int64)

补充:one-hot encoding(独热编码)与pd.get_dummies(data,prefix)

独热码,在英文文献中称做 one-hot code, 直观来说就是有多少个状态就有多少比特,而且只有一个比特为1,其他全为0的一种码制。
pd.get_dummies(data,prefix)是pandas实现独热编码的函数。
其中data是要转换的文件
prefix是表头前缀
具体参考官网说明

官网说明

如一个dataframe:

A B C
a b 1
b a 2
a c 3

特征A有2种不同的值:[‘a’,‘b’]
特征B有3种不同的值[‘b’,‘a’,‘c’]
特征C有3种不同的值[1,2,3]#此处为数字
独热编码后
A中的
‘a’:[1 0]
‘b’:[0 1]
B中的
‘b’:[1 0 0]
‘a’:[0 1 0]
‘c’:[0 0 1]
由于C已经为数字,所以不再转化,直接输出
即利用线性无关的单位向量来表示不同的值(类似线性方程组中的基础解系

由此原dataframe可转化为

10 100 1
01 010 2
10 001 3

代码实现

df=pd.DataFrame({'a':['5',5,2],'b':[7,4,1],'c':['a','v','s']})
print(df)a  b  c
0  5  7  a
1  5  4  v
2  2  1  s
df_1=pd.get_dummies(df)
print(df_1)b  a_2  a_5  a_5  c_a  c_s  c_v
0  7    0    0    1    1    0    0
1  4    0    1    0    0    0    1
2  1    1    0    0    0    1    0

注意:除非某种特征值全为数字(如b列),不会进行转化,只要有一个值不是数字就要进行转化(a列中的 ‘5’)

查看训练集:

print(data_x)age  fnlwgt       ...            native_country_ Vietnam   native_country_ Yugoslavia
0       39   77516        ...                        0                           0
1       50   83311        ...                        0                           0
2       38  215646        ...                        0                           0
...     ...   ...         ...                      ...                         ...
32560   52   287927       ...                        0                           0
[32561 rows x 106 columns]

查看train.csv

text = open('b.csv', 'w+')my_writer = csv.writer(text, delimiter=',', lineterminator='\n')for i in data_x.T:  # i为data_x的每一个列名,键的类型为stringmy_writer.writerow(data_x.T[i])#这里为转置text.close()

查看合并集

           age  fnlwgt  ...  native_country_ Vietnam  native_country_ Yugoslavia
# # 0       25  226802  ...                        0                           0
# # 1       38   89814  ...                        0                           0
# # ...    ...     ...  ...                      ...                         ...
# # [16281 rows x 105 columns]

0.3特征缩放

可以看到不同特征数据的取值范围差异很大,这样会导致梯度下降很慢(如对二维特征向量来说loss(w1,w2)的图像扁长,最优情况下图像应为近似圆形),因此要将特征进行归一化处理——特征缩放(feature scaling)。常用方法有:

1.均值归一化
2.方差归一化
3.标准归一化

其中标准归一化即正态分布标准化

x=(x-μ)/σ

是较为常用的特征缩放方法

# feature scaling
data_x=(data_x-data_x.mean())/data_x.std()

小问题

训练集:[32561 rows x 106 columns]
合并集:[16281 rows x 105 columns]

打印后发现训练集与合并集列数并不相同,如下图:
native_country_holand-netherland多出来了,对其进行删除

李宏毅机器学习HW2-winner or loser-利用逻辑回归进行收入分类相关推荐

  1. 【机器学习基础】(三):理解逻辑回归及二分类、多分类代码实践

    本文是机器学习系列的第三篇,算上前置机器学习系列是第八篇.本文的概念相对简单,主要侧重于代码实践. 上一篇文章说到,我们可以用线性回归做预测,但显然现实生活中不止有预测的问题还有分类的问题.我们可以从 ...

  2. stanford coursera 机器学习编程作业 exercise 3(逻辑回归实现多分类问题)

    本作业使用逻辑回归(logistic regression)和神经网络(neural networks)识别手写的阿拉伯数字(0-9) 关于逻辑回归的一个编程练习,可参考:http://www.cnb ...

  3. 一小部分机器学习算法小结: 优化算法、逻辑回归、支持向量机、决策树、集成算法、Word2Vec等...

    优化算法 先导知识:泰勒公式 \[ f(x)=\sum_{n=0}^{\infty}\frac{f^{(n)}(x_0)}{n!}(x-x_0)^n \] 一阶泰勒展开: \[ f(x)\approx ...

  4. 收藏!!如何 Get 机器学习必备的算法技能? | 逻辑回归

    本文是吴恩达老师的机器学习课程[1]的笔记和代码复现部分(逻辑回归). 作者:黄海广[2] 备注:笔记和作业(含数据.原始作业文件).视频都在github[3]中下载. 我将陆续将课程笔记和课程代码发 ...

  5. 吴恩达《机器学习》学习笔记八——逻辑回归(多分类)代码

    吴恩达<机器学习>笔记八--逻辑回归(多分类)代码 导入模块及加载数据 sigmoid函数与假设函数 代价函数 梯度下降 一对多分类 预测验证 课程链接:https://www.bilib ...

  6. 机器学习:理解逻辑回归及二分类、多分类代码实践

    作者 | caiyongji   责编 | 张红月 来源 | 转载自 caiyongji(ID:cai-yong-ji) 本文的概念相对简单,主要侧重于代码实践.现实生活中不止有预测的问题还有分类的问 ...

  7. 机器学习算法(一): 基于逻辑回归的分类预测-Task01

    基于逻辑回归LR的分类预测 1.逻辑回归的介绍 Logistic Regression 虽然被称为回归,但其实际上是分类模型,并常用于二分类.Logistic Regression 因其简单.可并行化 ...

  8. 分类任务如何用逻辑回归实现_【机器学习面试总结】—— LR(逻辑回归)

    逻辑回归是一个非常经典的算法,其中也包含了非常多的细节,曾看到一句话:如果面试官问你熟悉哪个机器学习模型,可以说 SVM,但千万别说 LR,因为细节真的太多了. 1. 模型介绍 Logistic Re ...

  9. ML机器学习算法(一): 基于逻辑回归的分类预测

    机器学习算法(一): 基于逻辑回归的分类预测 1 逻辑回归的介绍和应用 1.1 逻辑回归的介绍 逻辑回归(Logistic regression,简称LR)虽然其中带有"回归"两个 ...

  10. 机器学习(三):理解逻辑回归及二分类、多分类代码实践

    本文是机器学习系列的第三篇,算上前置机器学习系列是第八篇.本文的概念相对简单,主要侧重于代码实践. 上一篇文章说到,我们可以用线性回归做预测,但显然现实生活中不止有预测的问题还有分类的问题.我们可以从 ...

最新文章

  1. 困难样本挖掘(Online Hard Sample Mining)
  2. Netflix:如何通过机器学习提高流媒体质量?
  3. win10 下pycharm+anaconda 编译生成pyd文件
  4. Pandas 中 把Dataframe 格式转化为 array 数组
  5. 正常血压(信息学奥赛一本通-T1076)
  6. 全球最大的市场在_我如何扩展全球最大的音乐工作室市场
  7. OSX EI Captain中安装Pear等三方软件不成功的解决方法
  8. 项目启动会ppt_项目经理实战篇-项目启动会
  9. /etc/apt/sources.list.d/ros-latest.list' permission denied
  10. 数据库的基本结构三个层次
  11. Informatica优化 - DTM Buffer Size
  12. Oracle中国区大裁员:昔日辉煌不再,退出中国市场?
  13. mysql系统找不到指定文件_mysql安装常见问题(系统找不到指定的文件、发生系统错误......
  14. sql语句根据身份证号获取年龄
  15. Java入门基本数据类型(羊驼)
  16. 利用思维导图,快速整理小学语文复习重点,建议为孩子收藏!
  17. TypeError: classification_report() takes 2 positional arguments but 3 were given的解决方案
  18. Python3爬取Bing每日图片,并设置为电脑桌面
  19. Windows10 WIFI蓝牙图标消失,网卡驱动出现感叹号等无法上网的情况解决方案
  20. DellOptiPlex 5060台式机WinServer2012系统安装网卡驱动回顾

热门文章

  1. 苹果电脑您没有权限来打开应用程序_苹果电脑换“芯”,全网最快的Apple Silicon M1 MacBook Air发售...
  2. python动态是什么意思_怎么看出自己是Python什么阶段
  3. 昆明职高计算机学校,昆明职高学校,昆明职高学校前十强,昆明职高学校哪些比较好一点 - IT教育频道...
  4. Pannellum:实例之全景图预览
  5. mysql temp table_新特性解读 | MySQL 8.0 Temptable 引擎介绍
  6. 五步完成Spring整合Mybatis的完整示例
  7. FFmpeg学习(9)—— 调整播放速度
  8. C++_模板全特化、偏特化
  9. 图像语义分割(16)-DUpsampling-新型上采样模块:能够聚合丰富特征的数据相关型解码方式(CVPR2019)
  10. CentOS 7伪分布式方式安装Hadoop-2.6.0-cdh5.6.0并且通过主机浏览器访问hadoop工作台