Python快速实战机器学习(2) 数据预处理

Stella981
• 阅读 581

导语

机器学习是如今人工智能时代背景下一个重要的领域,它应用广泛,如推荐系统,文本分析,图像识别,语言翻译等等。要想学通这个大的领域不是一件容易的事情,所以我打算集大家之长,开通一个“Python快速实战机器学习”系列,用Python代码实践机器学习里面的算法,旨在理论和实践同时进行,快速掌握知识。

前面课程:

Python快速实战机器学习(1) 教材准备

本文概要

1、学会用pandas导入数据;

2、学会用matplotlib可视化数据;

3、学会用sklearn给标签编码。

4、学会用sklearn划分数据集。

5、学会用sklearn进行特征缩放。

01

导入数据

import pandas as pd

df = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data',header=None)

df.tail()

我们使用pandas读取数据,然后通过pandas中的tail方法输出最后五行数据,看一下Iris数据集格式:

Python快速实战机器学习(2) 数据预处理

这是一个来自叫做“UCI Machine Learning Repository”数据集。UCI Machine Learning Repository:它是网络中最古老的数据集源之一,是寻找各种有趣数据集的第一选择。在这里,尽管数据集都是用户自行贡献的,但清洁程度仍然很高。此外,你可以直接从 UCI Machine Learning Repository 上下载数据,无需注册。

Python快速实战机器学习(2) 数据预处理

这个数据集是关于鸢尾花分类的问题,一个150个数据,第一列是编号,第二列到第五列是鸢尾花的各种参数,也叫做“特征(features)”是我们判断鸢尾花属于哪种的依据。最后一列就是鸢尾花的种类。

02

数据可视化

import numpy as np

import matplotlib.pyplot as plt

Y = df.iloc[0:100,4].values

X = df.iloc[0:100,[0,2]].values

plt.scatter(X[:50,0], X[:50,1], color='red', marker = 'o', label = 'setosa')

plt.scatter(X[50:100,0], X[50:100,1], color='blue', marker = 'x', label = 'versicolor')

plt.xlabel('petal length')

plt.ylabel('sepal length')

plt.legend(loc='upper left')

plt.show()

我们抽取出前100条样本,这正好是Setosa(前五十个数据)和Versicolor(后五十个数据)对应的样本,我们将Versicolor对应的数据作为类别1,Setosa对应的作为-1。对于特征,我们抽取出sepal length和petal length两维度特征,然后用散点图对数据进行可视化:

Python快速实战机器学习(2) 数据预处理

03

标签编码

from sklearn.preprocessing import LabelEncoder

labelencoder_Y = LabelEncoder()

Y =  labelencoder_Y.fit_transform(Y)

我们使用sklearn中的preprocessing模块中LabelEncoder函数给鸢尾花的种类Y编码,因为在编码之前,Y存储的是鸢尾花的名字,也就是字符串变量。我们无法用字符串变量进行数值计算,因此我们需要把它变成0,1,2这种格式的数据。大家可以打印编码后的Y来查看编码的效果。

04

划分数据

from sklearn.model_selection import train_test_split

X_train, X_test, Y_train, Y_test = train_test_split( X , Y , test_size = 0.2, random_state = 0)

print (X_train.shape)

print (X_test.shape)

我们使用sklearn中的切分数据集的模块,model_selection来完成训练集和测试集的划分。一般而言我们随机从整个数据集中找到80%的数据作为训练集,另外20%的数据作为测试集。一个更加严谨的办法是将整个数据集随机划分成五份,然后依次用其中的一份作为测试集,另外四份合并作为训练集,对算法运行五次,最后取五次的平均值作为最终的结果。这里我们只用一次,作为演示。大家可以看到我们打印了训练集和数据集的形状,的确按照八二分。

05

特征缩放

from sklearn.preprocessing import StandardScaler

sc_X = StandardScaler()

X_train = sc_X.fit_transform(X_train)

X_test = sc_X.fit_transform(X_test)

由于我们的特征不止一个维度,每个维度之间没有同一个刻度,会导致两个维度之间的数据差距特别大。可能一个维度的数据是0.1,0.2这种小于1的数字;而另一个维度是1000,2000这种非常大的数字。因此,我们需要给特征缩放,让他们都在同一个尺度,方便后面进行模型计算。

如果你喜欢本文,请分享到朋友圈,想要获得更多信息,请关注我。

本文分享自微信公众号 - Python学会(gh_39aead19f756)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Stella981 Stella981
2年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这