据各种专业和业余的统计,在机器学习领域,Python语言的热度逐年上升。作为一种计算机程序设计语言,以简洁,易读性被广泛选择。伴随着大数据,深度学习领域的迅速发展,Python作为实现这些方法的友好语言,其拥护者也急剧上升。然而,Python的远远不止于此,编写应用程序,创建游戏,设计算法等等都可以应用其实现。那么,如此强大的编程语言。你是否掌握了呢?
本篇引入为以后的机器学习分享做基础,作为入门级教程,适合久闻Python其名,苦于无法找准门路的同学们。大佬们都说Python语言最简单,为何学习之路仍苦难重重?读过好多书籍,仍无法入门?那是因为对于无基础的同学,一门新的综合性的语言实在过于繁杂。而写书的Boss们长时间在编程界顶层,无法理解最底层的同学们可能在安装这一步都难以通过。对于初学者,往往一个简单的小Bug,足以劝退一颗热忱的心。有范君为了避免这种情况的出现,使入门过程更平滑。让同学们顺顺利利的入门Python。特意亲身试验以下全部过程,确保准确。
作为机器学习系列分享的导引内容,不介绍Python语言的数据类型,语法等基础知识,直接对机器学习三个最基础的包:Numpy,Pandas,Sklearn (Scikit-Learn)进行演示。通过学习演示,模拟编程,项目实践的过程,实现从入门到精通的平滑化过程。同时也加快Python和机器学习主题的融合过程,之前的R语言的分享中,有范君自己的观点就是入门一定要快。
安装教程
对于安装Python,大多数书籍普遍推荐Anaconda组件,这里我们也不例外。主要是这个组件对于初学者比较友好,主动的安装了大量的依赖包。同时十分方便查找帮助教程。如何安装呢?官网奉上:https://www.anaconda.com/。下载过程:Download -> 下滑后选择对应操作系统 -> Download(64/32位)。
但是官网安装一般是最新的版本,这里有一个问题就是,Python一些相关的包并没有更新,可能不支持最新的版本。所以,这里建议下载一个教新的版本就好。那么奉上历史版本Anaconda的下载地址(清华源):https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/。选择Anaconda3-5.0.1即可。下载完成,进入安装过程,过程只有下图地方需要注意一下,以下图中两个勾选框都要选中,你要问不选中会怎样,只能说后果自负哦。
安装完成,打开Spyder编辑器或者Jupyter Notebook,什么,找不到?喏,看下图。
打开的Spyder编辑器如下图所示,十分友好,与RStudio布局十分相似。当然,你可以修改字体,布局相关设置。在工具栏的Tools -> preferences中设置即可。关于Jupyter Notebook不多介绍,与Spyder不同风格,各有优势,选用就可以了。到了这一步,那么恭喜你,安装成功,如果在这之前出现了问题,可以在下面留言,接下来我们进行正题,Pyhton之中三大数据科学包的使用。
Numpy
为什么学习Numpy?相对于Python内置的列表,对于高维数据的储存和处理提供了更友好的表现和实现形式。
01
利用Numpy创建所需数组
在处理实际机器学习问题的时候,数据是我们处理的核心对象。于Python中引入数据,无外乎有两种形式,从外部文件中读入数据,或者构建一些数据。那么在构建数据的时候,Numpy显得格外强大!
代码语言:javascript复制# -*- coding: utf-8 -*-
## numpy
import numpy as np
# 创建一个numpy数组
array_items = np.array([1,4,5])
print(array_items)
# 生成有规律的数据
# 注意生成数组的统一形式,参数为数组的维度和内容
print("生成均为0的数组:",'n',np.zeros(10,dtype = int))
print("生成均为1的数组:",'n',np.ones((3,5),dtype = float))
print("生成为指定数字的数组:",'n',np.full((3,5),3.14))
print("生成0~20之间,间隔为2的数组:",'n',np.arange(0,20,2))
print("生成10个0~20之间,均匀间隔的数组:",'n',np.linspace(0,20,10))
print("生成均匀分布的数组:",'n',np.random.random((3,3)))
print("生成正态分布的数组:",'n',np.random.normal(0,1,(3,3)))
print("生成随机整数的数组:",'n',np.random.randint(0,10,(3,3)))
print("生成单位阵:",'n',np.eye(3))
*****Result of Print*****
生成均为0的数组:
[0 0 0 0 0 0 0 0 0 0]
生成均为1的数组:
[[ 1. 1. 1. 1. 1.]
[ 1. 1. 1. 1. 1.]
[ 1. 1. 1. 1. 1.]]
生成为指定数字的数组:
[[ 3.14 3.14 3.14 3.14 3.14]
[ 3.14 3.14 3.14 3.14 3.14]
[ 3.14 3.14 3.14 3.14 3.14]]
生成0~20之间,间隔为2的数组:
[ 0 2 4 6 8 10 12 14 16 18]
生成10个0~20之间,均匀间隔的数组:
[ 0. 2.22222222 4.44444444 6.66666667 8.88888889
11.11111111 13.33333333 15.55555556 17.77777778 20. ]
生成均匀分布的数组:
[[ 0.98877834 0.18669815 0.04938441]
[ 0.55236765 0.77685265 0.37389794]
[ 0.03420347 0.53582416 0.64340042]]
生成正态分布的数组:
[[ 0.87811807 -0.24126201 0.33558333]
[ 0.52183808 -0.81386997 0.19239122]
[-0.87644177 -0.29260062 -0.19571332]]
生成随机整数的数组:
[[3 3 7]
[9 1 4]
[9 9 4]]
生成单位阵:
[[ 1. 0. 0.]
[ 0. 1. 0.]
[ 0. 0. 1.]]
02
利用Numpy操作数组
对于得到的数组,为了满足我们的控制欲望,显然我们最希望的是可以对它们进行随心所欲的操作。包括显示任意位置的数字,顺序、逆序显示,使两个数组横着拼、竖着拼等等。
代码语言:javascript复制## 生成三个测试数组
np.random.seed(1234) # 随机种子,可复现结果
ExampleArray1 = np.random.random((2,2))
ExampleArray2 = np.random.normal(0,1,(2,2))
ExampleArray3 = np.random.randint(0,10,5)
# 索引指定位置数据
print("ExampleArray1:",'n',ExampleArray1)
print("行逆序显示:",'n',ExampleArray1[::-1,:])
print("列逆序显示:",'n',ExampleArray1[:,::-1])
print("完全逆序显示:",'n',ExampleArray1[::-1,::-1])
print("索引[0,0]位置数据:",'n',ExampleArray1[0,0])
print("索引第一列数据:",'n',ExampleArray1[:,0])
print("索引第一行数据:",'n',ExampleArray1[0,:])
print("ExampleArray2:",'n',ExampleArray2)
print("行拼接:",'n',np.concatenate([ExampleArray1,ExampleArray2],
axis = 0))
print("列拼接:",'n',np.concatenate([ExampleArray1,ExampleArray2],
axis = 1))
print("ExampleArray3:",'n',ExampleArray3)
print("顺序排序:",'n',np.sort(ExampleArray3))
print("逆序排序:",'n',np.sort(ExampleArray3)[::-1])
*****Result of Print*****
ExampleArray1:
[[ 0.19151945 0.62210877]
[ 0.43772774 0.78535858]]
行逆序显示:
[[ 0.43772774 0.78535858]
[ 0.19151945 0.62210877]]
列逆序显示:
[[ 0.62210877 0.19151945]
[ 0.78535858 0.43772774]]
完全逆序显示:
[[ 0.78535858 0.43772774]
[ 0.62210877 0.19151945]]
索引[0,0]位置数据:
0.191519450379
索引第一列数据:
[ 0.19151945 0.43772774]
索引第一行数据:
[ 0.19151945 0.62210877]
ExampleArray2:
[[-0.72058873 0.88716294]
[ 0.85958841 -0.6365235 ]]
行拼接:
[[ 0.19151945 0.62210877]
[ 0.43772774 0.78535858]
[-0.72058873 0.88716294]
[ 0.85958841 -0.6365235 ]]
列拼接:
[[ 0.19151945 0.62210877 -0.72058873 0.88716294]
[ 0.43772774 0.78535858 0.85958841 -0.6365235 ]]
ExampleArray3:
[6 8 0 5 0]
顺序排序:
[0 0 5 6 8]
逆序排序:
[8 6 5 0 0]
03
利用Numpy进行通用函数计算
Numpy里面封装了许多常用的数值计算的函数,可以很方便进行一些基础计算。
代码语言:javascript复制# 数组计算
np.random.seed(1111) # 随机种子,可复现结果
ExampleArray4 = np.random.randint(0,10,5)
print("ExampleArray4:",'n',ExampleArray4)
print("指数运算:",'n',np.exp(ExampleArray4))
print("对数运算:",'n',np.log(ExampleArray4))
print("求和运算:",'n',np.sum(ExampleArray4))
print("求积运算:",'n',np.multiply.reduce(ExampleArray4))
print("累加运算:",'n',np.add.accumulate(ExampleArray4))
print("累积百分比:",'n',np.add.accumulate(ExampleArray4)/np.sum(ExampleArray4))
print("取最大运算:",'n',np.max(ExampleArray4))
*****Result of Print*****
ExampleArray4:
[7 5 1 2 4]
指数运算:
[ 1096.63315843 148.4131591 2.71828183 7.3890561 54.59815003]
对数运算:
[ 1.94591015 1.60943791 0. 0.69314718 1.38629436]
求和运算:
19
求积运算:
280
累加运算:
[ 7 12 13 15 19]
累积百分比:
[ 0.36842105 0.63157895 0.68421053 0.78947368 1.]
取最大运算:
7
Pandas
Numpy在实际数据操作过程中给我们提供了很多方便,但是大多数情况下,我们需要从外部文件中获取原数据,虽然存取数据的方式有很多,但是Pandas包绝对是你不容错过的一款。另外,Pandas包的强大远不止于此,其高效的DataFrame数据结构,具有行列标签的数组,是重多从事数据科学人员的最舒适的结构。
01
利用Pandas存取数据
代码语言:javascript复制# -*- coding: utf-8 -*-
import pandas as pd
import os
print("当前工作目录:",os.getcwd())
## 注意,如果默认路径非code文件夹,需要运行下面语句改为code文件夹路径,具体路径参考个人下载的路径,
## 例如将文件下载在D盘,那么将"path/to/code"换为"D:/A_TechnologyScience/python/code"
## os.chdir("path/to/code")
ExampleDataPath = "../data/Example.csv"
## 从csv文件读取数据
ExampleData = pd.read_csv(ExampleDataPath,encoding = 'gbk')
print("数据类型:",'n',type(ExampleData))
print("数据维度:",'n',ExampleData.shape)
print("显示前5行数据:",'n',ExampleData.head())
## DataFrame保持为csv文件
ExampleSavePath = "../data/ExampleSave.csv"
ExampleData.to_csv(ExampleSavePath,index = False)
02
利用Padans操作数据
代码语言:javascript复制## 操作数据
## 索引:loc iloc
## loc:显式索引,使用行列名来索引数据
## iloc:隐式索引,使用行列的序号索引数据
print("显式索引:",'n',ExampleData.loc[0:2,["学历","男生"]])
print("隐式索引:",'n',ExampleData.iloc[0:2,0:2])
## 注意到它们之间的区别,显式索引的0:2指行名为0,1,2,所以输出三行隐式索引的0:2指行的序号0:2,python内置的机## 制一般是取前舍后,即0:2,取0,1,舍掉2,最后显示前两行。
## DataFrame扩展
ExampleData['睡眠时间'] = [8,7,6,5,4]
print("添加一列:",'n',ExampleData.head())
ExampleData = ExampleData.append({"学历":"幼儿园","男生":5 ,"女生":7,"睡眠时间":10},ignore_index=True)
print("添加一行:",'n',ExampleData.head(6))
## 数据统计数据分析
print("统计指标:",'n',ExampleData.describe())
*****Result of Print*****
显式索引:
学历 男生
0 小学生 10
1 中学生 20
2 大学生 25
隐式索引:
学历 男生
0 小学生 10
1 中学生 20
添加一列:
学历 男生 女生 睡眠时间
0 小学生 10 15 8
1 中学生 20 27 7
2 大学生 25 35 6
3 研究生 37 21 5
4 博士生 16 20 4
添加一行:
学历 男生 女生 睡眠时间
0 小学生 10 15 8
1 中学生 20 27 7
2 大学生 25 35 6
3 研究生 37 21 5
4 博士生 16 20 4
5 幼儿园 5 7 10
统计指标:
男生 女生 睡眠时间
count 6.000000 6.000000 6.000000
mean 18.833333 20.833333 6.666667
std 11.373947 9.641922 2.160247
min 5.000000 7.000000 4.000000
25% 11.500000 16.250000 5.250000
50% 18.000000 20.500000 6.500000
75% 23.750000 25.500000 7.750000
max 37.000000 35.000000 10.000000
Pandas内置的功能远远不止于这些,例如其数据清洗,数据透视表,Groupby函数,Merge拼接函数等等。作为入门指南,先简单介绍到这里。
Sklearn
Sklearn是Python内实现机器学习算法的模块。以其干净,统一,高效的特性被广泛使用。由于篇幅的原因,我们在后续的实践中,逐渐掌握这个模块。
总结
做一篇Python数据分析的完整教程需要耗费的心血远远超出作者的预期,本篇旨在提供一片入门级的教程,希望缩减后的内容可以被读者更容易接收和理解,通过试着运行本篇代码,降低对Python的陌生感。更进一步的介绍将在后续的内容上呈上。另外本篇内容结合作者实践和主要参考书籍《Python数据科学手册 Jake,VanderPlas著 陶俊杰,陈小莉译》,如有兴趣,可移步原书籍,系统学习。本文相关代码和数据详见:https://github.com/ncepumas/A_TechnologyScience/tree/master/python。