机器学习入门
本文笔记根据课程:《机器学习入门》黑马程序员配套使用,相关内容均摘要自视频(持续更新中。。。)
一、机器学习概述
1机器学习流程
- 获取数据
- 数据基本处理
- 特征工程
- 机器学习(模型训练)
- 模型评估
2 模型评估
分类模型评估:准确率
回归模型评估:
- 均方根误差
- 相对平方误差
- 平均绝对误差
- 相对绝对误差
3 拟合
- 过拟合:模型训练的太过粗糙,连数据集中的样本数据特征关系都没有学习出来
- 欠拟合:所建的机器学习模型或者是深度学习模型在训练样本中表现得过于优越,导致在预测数据集中表现不佳
二、Matplotlib
1 matplotlib主要格式
- 准备数据
- 创建画布
- 绘制图像
3.1 添加x,y轴刻度
3.2 修改x,y轴的标签
3.3 添加x,y轴描述信息
3.4 添加图标题
3.5 添加网格 - 图像显示
2 解决中文符号显示问题
# 设置中文显示
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
3 常见图形绘制
-
折线图:
api:plt.plot(x, y)
-
散点图:
api:plt.scatter(x, y)
-
柱状图:
api:plt.bar(x, width, align = "center", **kwargs)
-
直方图:
api:matplotlib.pyplot.hist(x, bins = None)
-
饼图:
plt.pie(x, labels = , autopct = , colors = )
三、Numpy
1 生成数组的方法
1.1 生成0和1的数组
- np.ones(shape, dtype):生成全是1的数组
- np.ones_like(a, dtype):复制其他数组,将其中的元素全部改为1
- np.zeros(shape, dtype):生成全是0的数组
- np.zeros_like(a, dtype):复制其他数组,将其中的元素全部改为0
1.2 从现有数组生成
np.array(object, dtype) # 深拷贝,从现有数组中创建,修改原数组值不变
np.array(a, dtype) # 浅拷贝,相当于索引的形式,并没有创建一个新的数组,修改原数组值跟着一起变
1.3 生成固定范围的数组
np.linspace(start, stop, num, endpoint)
创建等差数组-指定数量
start:序列的起始值
end:序列的结束值
num:要生成的等间隔样例数量,默认为50
endpoint:序列中是否包含stop值,默认为True
np.arange(start, stop, step, dtype)
创建等差数组-指定步长
step:步长,默认为1
np.logspace(start, stop, num)
创建关于10^x的等比数列
num:要生成的等比数列数量,默认为50
1.4 生成随机数组
1.4.1 使用模块介绍
- np.random模块
1.4.2 正太分布
np.random.randn(d0, d1, ..., dn)
从标准正太分布中返回一个或多个样本值
np.random.normal(loc = 1.0, scale = 1.0, size = None) # 使用最多
scale越大越矮胖,scale越小越瘦高
loc:均值, scale:标准差, size:输出的shape,默认为None,只输出一个值
np.random.standard_normal(size = None)
返回指定形状的标准正态分布的数组
1.4.3 均匀分布
np.random.rand(d0, d1, ..., dn)
返回[0.0, 1.0)内的一组均匀分布的数
np.random.uniform(low = 0.0, high = 1.0, size = None) # 使用最多
从一个均匀分布[low, high)中随机采样,注意定义域是左闭右开,即包含low,不包含high
参数介绍:
low:采样下界,float类型,默认值为0
high:采样上界,float类型,默认值为1
size:输出样本数目,为int或元组(tuple)类型,例如,size=(m,n,k),则输出mnk个 样本,缺省时输出1个值
返回值:ndarray类型,其形状和参数size中描述一致
np.random.randint(low, high = None, size = None, dtype = '1')
从一个均匀分布中随机采样,生成一个整数或N维整数数组
取值范围:若high不为None时,取[low,high)之间的随机整数,否则取值[0,low)之间随机整数
2 数组的索引、切片
一维、二维、三维的数组索引
- 直接进行索引、切片
- 对象[ : , : ] – 先行后列
举个例子:
a = [[1, 2, 3], [4, 5, 6]]
# a[0, 1:3] = [2, 3]
3 形状修改
3.1 ndarray.reshape(shape, order)
- 返回一个具有相同数据域,但shape不一样的视图
- 行、列不进行互换
# 在转换形状的时候,一定要注意数组的元素匹配,arr为四行五列
arr.reshape([5, 4])
arr.reshape([-1, 10]) # 数组的形状被修改为:(2, 10), -1:表示通过待计算
3.2 ndarray.resize(new_shape)
- 修改数组本身的形状(需要保持元素个数前后相同)
- 行、列不进行互换
arr.resize([5, 4])
3.3ndarray.T
- 数组的转置
- 将数组的行、列进行互换
4 类型修改
4.1 ndarray.astype(type)
arr.astype(np.int32)
4.2 ndarray.tostring([order])或者ndarray.tobytes([order])
arr = np.array([[1, 2, 3], [4, 5, 6]])
arr.tostring
4.3 jupyter输出太大可能导致崩溃问题11
5 数组的去重
np.unique()
arr = [[3, 0, 8, 3], [4, 2, 7, 9], [1, 6, 1, 4]]
arr1 = np.unique(arr) # arr1 = [0 1 2 3 4 6 7 8 9]
6 ndarray运算
6.1 逻辑运算
arr > 60 # 返回True或者False
arr[arr > 60] = 100 # 将所有大于60的元素替换成100
6.2 通用判断函数
- np.all(arr > 60):判断arr数组中的元素是否全部满足
- np.any(arr > 60):判断arr数组中的元素是否有任意一个满足
6.3 np.where(三元运算符)
np.where(arr > 60, 1, 0) # 判断arr中大于69的值替换为1,否则替换为0
# 符合逻辑,判断arr中大于60且小于90的值替换为1,否则替换为0
np.where(np.logical_and(arr > 60, arr < 90), 1, 0)
np.where(np.logical_or(arr < 60, arr > 90), 1, 0)
6.4 统计运算
统计指标(axis表示行或者列,一般取0或者1)
- 最小值:min(arr, axis)
argmin:最小元素的下标 - 最大值:max(arr, axis)
- 中位数:median(arr, axis)
- 平均值:mean(arr, axis, dtype)
- 标准差:std(arr, axis, dtype)
- 方差:var(arr, axis, dtype)
6.5 数组间运算
6.5.1 数组与数之间的运算
6.5.2 数组与数组之间的运算
广播机制
条件任一:
- 数组的某一维度等长
- 其中一个数组的某一维度为1
arr1 = np.random.randint(0, 10, ( 3, 2)) # 其中( 3, 2)
arr2 = np.random.randint(0, 10, (2, 3, 1)) # 和(2, 3, 1)必须竖着对应满足上述条件
7.数学:矩阵
7.1 矩阵和向量
7.1.1 矩阵乘法API:
np.matmul:只能进行矩阵和矩阵相乘
np.dot:可以进行数字与矩阵相乘
四、Pandas
1 Pandas数据结构
1.1 Series
series是一个类似于一维数组的数据结构,它能够保存任何类型的数据,比如整数、字符串、浮点数等,主要由一组数据和与之相关的索引两部分构成
1.1.1 Series的创建
导入pandas
import pandas as pd
pd.Series(data = None, index = None, dtype = None)
参数:
- data:传入的参数,可以是ndarray、list等
- index:索引,必须是唯一的,且与数据的长度相等。如果没有传入索引参数,则默认会自动创建一个从0-N的整数索引,也可以是键-值对的形式
- dtype:数据的类型
创建pandas:
arr = pd.Series(np.arange(5))
arr1 = pd.Series([3, 4, 2, 5, 8], index = [1, 2, 3, 4, 5])
arr2 = pd.Series({"red" : 10, "green" : 50, "blue" : 30})
1.1.2 Series的属性
series.index # 索引
series.values # 值
series[2] # 通过索引获得值
1.2 DataFrame
DataFrame是一个类似二维数组通过表格的对象,既有行索引,又有列索引
- 行索引:表明不同行,横向索引,叫index,0轴,axis = 0
- 列索引:表明不同列,纵向索引,叫columns,1轴,axis = 1
1.2.1 DataFrame的创建
import pandas as pd
pd.DataFrame(data = None, index = None, columns = None)
参数:
- index:行标签,如果没有传入索引参数,则默认会自动创建一个从0-N的整数索引
- columns:列标签,如果没有传入索引参数,则默认会自动创建一个从0-N的整数索引
通过已有数据创建:
pd.DataFrame(np.random.randn(2, 3))
1.2.2 DataFrame的属性
dataframe.shape # 输出行和列,如(3, 4)
dataframe.index # 索引
dataframe.values # 值
dataframe.T # 转置行与列
dataframe.head(n) # 显示前n行内容,如果不传入数字,则默认为5行
dataframe.tail(5) # 显示后n行内容
1.2.3 DataFrame索引的设置
- 修改行列索引值:dataframe.index = stu
必须整体全部修改,不能修改某一行的索引 - 重设索引:reset_index(drop = False)
设置新的下标索引
drop:默认为False,不删除原来索引,如果为True,删除原来的值
1.2.4 以某列值设置为新的索引
set_index(keys, drop = True)
- keys:列索引名或者列索引名称的列表
- drop:boolean,default True,当作新的索引,删除原来的列
1.3 MultiIndex
1.3.1 MultiIndex
MultiIndex是三维数据结构:多级索引(也称层次化索引)是pandas的重要功能,可以在Series和DataFrame对象上拥有2个及2个以上的索引
5. multiIndex的特性
dataframe.index # MultiIndex全部信息
dataframe.index.names # levels的名称
dataframe.index.levels # 每个levels的元组值
注意: df.index等价于mt,所以如果是mt的,直接mt.names或者mt.levels
- multiIndex的创建
arr = [[1, 2, 3, 2], ["r", "g", "b", "r"]] # 初始化二维数组
mt = pd.MultiIndex.from_arrays(arr, names = ("num", "color")) # 创建MultiIndex
1.4 基本数据操作
读取数据
data = pd.read_csv("..\data\data1.csv") # ..表示上一个文件,windoww:\\,linux:/
data.drop([5, 6, 7, 8], axis = 0) # 删除相应的行数或列数
1.5 索引操作
1.5.1 直接使用行列索引(先列后行)
data["name"][3] # "name"是列名称,3是行号
1.5.2 结合loc或者iloc使用索引
# loc只能指定索引行列的名称
print(data.loc[1:3]["name"]) # [1:3]是行号,"name"是列名称
# iloc可以索引行列的下标
print(data.iloc[2 : 4, 1 : 3])
1.6 赋值操作
data["name"] = "none" # 将name列全部改为none
1.7 排序
排序有两种方式,一种对索引进行排序,一种对内容进行排序
1.7.1 内容排序
df.sort_values(by = , ascending = ) # 单个键或者多个键进行排序
参数:
by:指定排序参考的键
ascending:True升序,False降序,默认升序
data.sort_value
data.sort_values(by = ["id", "age"], ascending = False)
1.7.2 索引排序
data.sort_values()
1.7.3 Series排序
print(data["name"].sort_values()) # "name"列的值排序
print(data["name"].sort_index()) # "name"列的索引排序
1.8 DataFrame运算
1.8.1 算数运算
data["age"].add(1) # 在"age"列加1,不改变原data的值
data["age"].sub(1) # 在"age"列减1,不改变原data的值
1.8.2 逻辑运算
data["age"] > 30 # "age"列大于30的数, 返回"age"列的True或者False
逻辑运算函数
- data.query(expr):expr为查询字符串
- data[data[“age”].isin([28,30]]:获取"age"为28和30的值
1.8.3 统计运算
基础统计函数:
data.describe() # 计算个数、平均值、标准值、最大值、最小值
data.median() # 计算中位数
data.idxmax() # 求的最大值的索引
data.idxmin() # 求的最小值的索引
累计统计函数:
data.comsum() # 计算前n个数的和
data.cummax() # 计算前n个数的最大值
data.cummin() # 计算前n个数的最小值
data.prod() # 计算前n个数的积
2 Pandas数据处理
2.1 pandas画图
- pandas.DataFram.plot
- pandas.Series.plot
DataFrame.plot(kind = "line")
Series.plot(kind = "line")
kind:str类型,需要绘制图形的种类
5. line:折线图(default)
6. bar:柱状图
7. barh:横向柱状图
8. hist:直方图
9. pie:饼图
10. sactter:散点图
2.2 文件读取与存储
了解Pandas的几种文件读取存储操作
应用CSV方式、HDF方式和json方式实现文件的读取和存储
2.2.1 CSV文件
- read_csv
pandas.read_csv(filepath_or_buffer, sep = ",", usecols)
filepath_or_buffer:文件路径
usecols:指定读取的列名,列表形式
2. to_csv
DataFrame.to_csv(path_or_buffer=None, sep = ",", columns = None, header = True, index = True, mode = "w", encoding = "None")
path_or_buffer:文件路径
sep:分隔符,默认用","隔开
columns:选择需要的列索引
header:boolean or list of string, default True, 是否写进列索引
index:是否写进行索引
mode:‘w’,重写,‘a’,追加
2.2.2 HDF5
read_hdf和to_hdf
HDF5文件的读取和存储需要指定一个键,值为要存储的DataFrame
pandas.read_hdf(path_or_buff, key = None, **kwargs)
DataFrame.to_hdf(path_or_buff, key, *\kwargs)