《零基础学Python》--第5章 机器学习库

281 阅读7分钟

第5章 机器学习库

机器学习算法的通用步骤:

数据采集,数据预处理,数据清洗,建模,测试

1.Numpy库

用于高性能科学计算和数据分析,是常用的高级数据分析库的基础包

A.numpy的安装

  1. 输入命令:pip3 install numpy

  2. 在终端中输入:***which python3***可以获取到系统python的位置

  3. 在PyCharm中设置***Preferences->Project->Project Interpreter->设置->Add***,添加python地址

  4. 在PyCharm中设置***Run->Edit Configurations***,解释器选择刚刚添加的解释器

B.numpy的使用

  • numpy.array(?)传入一个列表,返回一个被numpy封装过的列表,计算的效率远远高于python自带的列表
  • numpy.array(?).dtype返回列表中的数据类型
  • numpy.array(?) + numpy.array(?)可以实现列表的累加
import numpy as np

arr1 = np.array([2, 3, 4])
print(arr1)
print(arr1.dtype)
arr2 = np.array([1.2, 2.3, 3.4])
print(arr2.dtype)
print(arr1 + arr2)
"""
输出结果
[2 3 4]
int64
float64
[3.2 5.3 7.4]
"""

C.numpy数组和标量的计算

  • numpy数组可以直接和标量进行计算
  • numpy.zeros((3,4))定义一个3行4列全部为0的矩阵
  • numpy.ones((4,5))定义一个4行5列的全部为1的矩阵
  • numpy.empty((2,3,2))定义一个3维矩阵,矩阵全部设置为空值对程序计算是不安全的,会随机填入空值
import numpy as np

arr2 = np.array([1.2, 2.3, 3.4])
print(arr2 * 10)
print(np.zeros((3, 4)))
print(np.ones((4, 5)))
print(np.empty((2, 3, 2)))
"""
输出结果
[12. 23. 34.]
[[0. 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. 1. 1. 1. 1.]]
[[[0. 0.]
  [0. 0.]
  [0. 0.]]
 [[0. 0.]
  [0. 0.]
  [0. 0.]]]
"""

D.numpy数组的索引和切片

  • numpy.arange(start,stop,step),和python的range()功能相似,产生一个数组,下标索引从0开始计算
import numpy as np

arr = np.arange(10, 30, 2)
arr[5:8] = 11
print(arr)
arr_slice = arr[5:8].copy()
print(arr_slice)
arr_slice[:] = 13
print(arr_slice)
print(arr)
"""
输出结果
[10 12 14 16 18 11 11 11 26 28]
[11 11 11]
[13 13 13]
[10 12 14 16 18 11 11 11 26 28]
"""

2.Pandas库

用于进行数据的预处理和数据的清洗

A.pandas的安装

在终端中输入:pip3 install pandas

B.Series

  • Series就是对numpy的array进行了封装,自动添加了索引
  • 单独取出索引可以用Series.index
  • 单独取出值可以用Series.value
from pandas import Series

obj = Series([4, 5, 6, -7])
print(obj)
print(obj.index)
print(obj.values)
"""
输出结果
0    4
1    5
2    6
3   -7
dtype: int64
RangeIndex(start=0, stop=4, step=1)
[ 4  5  6 -7]
"""
  • 可以自定义索引值,而且pandas
  • 可以通过索引进行赋值
from pandas import Series

obj2 = Series([4, 7, -5, 3], index=['d', 'b', 'c', 'd'])
print(obj2)
obj2['d'] = 6
print(obj2)
print('a' in obj2)
"""
输出结果
d    4
b    7
c   -5
d    3
dtype: int64
d    6
b    7
c   -5
d    6
dtype: int64
False
"""
  • 索引可以进行相应的修改
from pandas import Series

sdata = {'beijing': 35000, 'shanghai': 71000, 'guangzhou': 16000,'shenzhen': 5000}
obj3 = Series(sdata)
print(obj3)
obj3.index = ['bj', 'sh', 'gz', 'sz']
print(obj3)
"""
输出结果
beijing      35000
shanghai     71000
guangzhou    16000
shenzhen      5000
dtype: int64
bj    35000
sh    71000
gz    16000
sz     5000
dtype: int64
"""
  • Series.reindex(index,fill_value,method="ffill,bfill")index表示索引,fill_value表示用于填充缺失值的数,ffill用前面的值填充,bfill表示用后面的值进行填充
from pandas import Series

obj4 = Series([4.5, 7.2, -5.3, 3.5], index=['b', 'd', 'c', 'a'])
obj5 = obj4.reindex(['a', 'b', 'c', 'd', 'e'], fill_value=0)
print(obj5)
obj6 = Series(['blue', 'purple', 'yellow'], index=[0, 2, 4])
print(obj6.reindex(range(6), method='bfill'))
"""
输出结果
a    3.5
b    4.5
c   -5.3
d    7.2
e    0.0
dtype: float64
0      blue
1    purple
2    purple
3    yellow
4    yellow
5       NaN
dtype: object
"""
  • Series.dropna()可以删除缺失值
from numpy import nan as NA

data = Series([1, NA, 2])
print(data.dropna())
"""
输出结果
0    1.0
2    2.0
dtype: float64
"""

C.DataFrame

多维数组的处理

  • DataFrame()添加参数columns=可以对列进行位置排序(列的位置替换,非列里面进行排序)
  • DataFrame['key']或者DataFrame.key可以根据key值获取到对应列的数据
  • DataFrame['newkey']=?可以添加新的列
from pandas import DataFrame

data = {'city': ['shanghai', 'shanghai', 'beijing', 'beijing'],
        'year': [2016, 2017, 2017, 2018],
        'pop': [1.5, 1.7, 2.4, 2.9]}
frame = DataFrame(data)
frame2 = DataFrame(data, columns=['year', 'pop', 'city'])
print(frame)
print(frame2)
print(frame2['city'])
print(frame2.year)
frame2['new'] = 100
print(frame2)
frame2['cap'] = frame2.city == 'beijing'
print(frame2)
"""
输出结果

       city  year  pop
0  shanghai  2016  1.5
1  shanghai  2017  1.7
2   beijing  2017  2.4
3   beijing  2018  2.9
   year  pop      city
0  2016  1.5  shanghai
1  2017  1.7  shanghai
2  2017  2.4   beijing
3  2018  2.9   beijing
0    shanghai
1    shanghai
2     beijing
3     beijing
Name: city, dtype: object
0    2016
1    2017
2    2017
3    2018
Name: year, dtype: int64
   year  pop      city  new
0  2016  1.5  shanghai  100
1  2017  1.7  shanghai  100
2  2017  2.4   beijing  100
3  2018  2.9   beijing  100
   year  pop      city  new    cap
0  2016  1.5  shanghai  100  False
1  2017  1.7  shanghai  100  False
2  2017  2.4   beijing  100   True
3  2018  2.9   beijing  100   True
"""
  • DataFrame.T可以将数据的行和列进行反转
from pandas import DataFrame

pop = {'beijing': {2008: 1.5, 2009: 2.0},
       'shanghai': {2008: 2.0, 2009: 3.6}}

frame3 = DataFrame(pop)
print(frame3)
print(frame3.T)
"""
输出结果
      beijing  shanghai
2008      1.5       2.0
2009      2.0       3.6
          2008  2009
beijing    1.5   2.0
shanghai   2.0   3.6
"""
  • DataFrame.dropna()可以删除多维数组的缺失值
    1. 添加参数how='all'只删除整行都是缺失值的数据,部分缺失值的可以保留
    2. 添加参数axis=1,删除一整列都是缺失值的数据
from pandas import DataFrame
from numpy import nan as NA

data2 = DataFrame([[1, 2, 3], [5, 6, NA], [NA, NA, NA]])
print(data2.dropna())
print(data2.dropna(how='all'))
data2[4] = NA
print(data2)
print(data2.dropna(axis=1, how='all'))
"""
输出结果
     0    1    2
0  1.0  2.0  3.0
     0    1    2
0  1.0  2.0  3.0
1  5.0  6.0  NaN
     0    1    2   4
0  1.0  2.0  3.0 NaN
1  5.0  6.0  NaN NaN
2  NaN  NaN  NaN NaN
     0    1    2
0  1.0  2.0  3.0
1  5.0  6.0  NaN
2  NaN  NaN  NaN
"""
  • DataFrame.fillna(x)将数据中所有的缺失值都用x进行填充,如果需要直接修改的话,需要添加inplace=True,如果不添加直接填充的副本
from pandas import DataFrame
from numpy import nan as NA

data2 = DataFrame([[1, 2, 3], [5, 6, NA], [NA, NA, NA]])
data2.fillna(3)
print(data2)
data2.fillna(4, inplace=True)
print(data2)
"""
输出结果
     0    1    2
0  1.0  2.0  3.0
1  5.0  6.0  NaN
2  NaN  NaN  NaN
     0    1    2
0  1.0  2.0  3.0
1  5.0  6.0  4.0
2  4.0  4.0  4.0
"""

3.层次化索引

  • Series.unstack(),可以将数据转换为DataFrame
  • DataFrame.stack(),可以将数据转换为Series
import numpy as np
from pandas import Series, DataFrame

data = Series(np.random.randn(10),
              index=[['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'd', 'd'],
                     [1, 2, 3, 1, 2, 3, 1, 2, 2, 3]])
print(data)
print(data['b':'c'])

print(data.unstack())
print(data.unstack().stack())
"""
输出结果
a  1    0.959932
   2   -0.308277
   3   -0.677998
b  1   -0.632334
   2   -0.776489
   3   -0.201669
c  1   -0.014423
   2    0.364285
d  2   -0.124033
   3    0.228125
dtype: float64
b  1   -0.632334
   2   -0.776489
   3   -0.201669
c  1   -0.014423
   2    0.364285
dtype: float64
          1         2         3
a  0.959932 -0.308277 -0.677998
b -0.632334 -0.776489 -0.201669
c -0.014423  0.364285       NaN
d       NaN -0.124033  0.228125
a  1    0.959932
   2   -0.308277
   3   -0.677998
b  1   -0.632334
   2   -0.776489
   3   -0.201669
c  1   -0.014423
   2    0.364285
d  2   -0.124033
   3    0.228125
dtype: float64
"""

4.Matplotlib的安装与绘图

在终端输入:pip3 install matplotlib进行安装

然后再py文件中引入:import matplotlib.pyplot as plt

1.plt.plot()绘制一条曲线
plt.plot([1, 3, 5], [5, 8, 9])
plt.show()

2.Matplotlib绘制numpy和pandas里面的数据
x = np.linspace(-np.pi, np.pi, 100)#定义域为-π到π,平均取100个点
plt.plot(x, np.sin(x))
plt.show()

3.绘制多条曲线
y = np.linspace(-np.pi * 2, np.pi * 2, 100)
plt.figure(2, dpi=50)  # 创建图表2,精度为50,dpi越大文件越大,杂志要300以上
for i in range(1, 5):
    plt.plot(y, np.sin(y / i))
plt.show()

4.绘制直方图(hist)
plt.figure(1, dpi=50)  # 创建图表1,精度50
data = [1, 2, 3, 4, 5, 2, 3, 1, 1, 4, 2, 4, 2]
plt.hist(data)  # 只要传入数据,直方图就会统计出数据出现的次数
plt.show()

5.绘制散点图(scatter)
x = np.arange(1, 10)
y = x
plt.scatter(x, y, c='r', marker='o')  # c='r'表示颜色为红色,marker表示形状为圆形
plt.show()

4.Pandas和Matplotlib结合使用

warnings.filterwarnings('ignore')#可以忽略运行时的warning
1.pandas读取csv并绘制散点图
iris = pd.read_csv("./iris_training.csv")
#打印csv的前五行数据
print(iris.head())
# 绘制散点图,120和4分别为csv中数据的列名
iris.plot(kind='scatter', x='120', y='4')
# 让pandas的plot()方法在PyCharm上显示
plt.show()
"""
输出结果
   120    4  setosa  versicolor  virginica
0  6.4  2.8     5.6         2.2          2
1  5.0  2.3     3.3         1.0          1
2  4.9  2.5     4.5         1.7          2
3  4.9  3.1     1.5         0.1          0
4  5.7  3.8     1.7         0.3          0
"""

2.seaborn安装和使用

安装方法:pip3 install seaborn

导入方法:import seaborn as sns

  • seabrorn可以直接使用的主题:darkgrid,whitegrid,dark,white,和ticks,默认为darkgrid
iris = pd.read_csv("./iris_training.csv")
# 设置样式
sns.set(style='white', color_codes=True)
# 设置绘制格式为散点图,size表示图标的大小
sns.jointplot(x='120', y='4', data=iris, size=5)
# distplot绘制曲线
sns.distplot(iris['120'])

plt.show()

iris = pd.read_csv("./iris_training.csv")
# 设置样式
sns.set(style='white', color_codes=True)
sns.FacetGrid(iris, hue='virginica', size=5).map(plt.scatter, 'setosa', 'versicolor').add_legend()

plt.show()

5.Tensorflow库

安装方法:pip3 install tensorflow