机器学习【学习笔记】
·
机器学习
机器学习与python概述
1.1 机器学习与人工智能
符号注意人工智能>>机器学习>>深度学习
1.1.1:🔣符号主义人工智能
核心思想:一切都可规则化编码
1.1.2 :🤖机器学习的人工智能
机器学习是一种新的编程范式
1.2 机器学习能做什么
采用怎样的策略或算法发现“数据”和“答案”之间的的关联性,并以哪种形式的规则体现,是机器学习的核心。
1.2.1:机器学习的学习对象:数据集
- 机器学习的学习对象是数据集合,简称数据集(也称样本集)
- 数据集中的一行通常称为一个样本观测。
- 数据集中的一列通常称为一个变量(也称特性)。
- 依各变量的取值类型可将变量细分为数值型、类别型和顺序型三类,后两类统称为分类型。
1.2.2:机器学习的任务
机器学习通过向数据集学习,完成两大主要任务:
一、数据预测
二、数据聚类,解答上述问题
-
数据预测:简而言之就是基于已有数据集,归纳出输入变量和输出变量之间的数量关系。在数量关系具有普适性和未来不变的假设下,将其用于新数据输出变量取值的预测。进一步,数据预测可分为回归和分类。
-
**数据聚类:**数据聚类的目的是发现数据中可能存在的小类,并通过小类的刻画和掲示数据的内在组织结构。
数据聚类和数据预测中的分类问题有联系更有区别:
(粗浅的理解)
联系:聚类和分类的样本观测都有一个标签
区别:分类标签的真实值已知;聚类标签的真实值未知
1.3 Python 实践课
python语言的特点标签:面向对象OOP、解释型、代码开源、可读性强、高效
1.3.1 Python & Anaconda
1.3.2 Python 第三方包的引用
- import 模块名: 导入指定模块
- from 模块名 import 函数名: 导入指定模块的指定函数
- from 模块名 import 函数名1,函数名2,函数名3,…: 导入指定模块中的若干个指定的函数
- from 模块名 import *:导入指定模块中的所有函数
import numpy
from numpy import data
from numpy import data,random
from numpy import *
import numpy as np
1.3.3 学习Python的NumPy包
NumPy包的特点
- N维数组形式的数据结构
- 拥有丰富的数学运算和统计函数【亮点:🔆矩阵运算】
1.3.3.1 NumPy数组的创建和访问
import numpy as np
data = np.array([1,2,3,4,5,6,7,8,9,10])
print('Numpy的1维数组:\n{0}'.format(data))
print('数据类型:%s'%data.dtype)
print('1维数组中各元素扩大10倍:\n{0}'.format(data * 10))
print('访问第2个元素:{0}'.format(data[1]))
data2 = np.array([[1,3,5,7,9],[2,4,6,8,10]])
print('访问2维数组的第1行第2列:{0}'.format(data2[0,1]))
print('访问2维数组第1行,第2至第4列元素:{0}'.format(data2[0,1:4]))
print('访问2维数组第1行上的所有元素:{0}'.format(data2[0,:]))
1.3.3.2 Python列表的补充说明
import numpy as np
data = [
[1,2,3,4,5,6,7,8,9],
['A','B','C','D','E','F','G','H','I']
]
print('data是Python的列表list:\n{0}'.format(data))
MyArray = np.array(data)
print('MyArray是Numpy的N维数组:\n%s\nMyArray的形状:%s'%(MyArray,MyArray.shape))
1.3.3.3 Numpy数组的计算
import numpy as np
MyArray = np.arange(10)
print('MyArray:\n{0}'.format(MyArray))
print('MyArray的基本描述统计量:\n均值:%f,标准差:%f,总和:%f,最大值:%f,'%(MyArray.mean(),MyArray.std(),MyArray.sum(),MyArray.max()))
print('MyArray的累计和:\n{0}'.format(MyArray.cumsum()))
print('MyArray的开平方:{0}'.format(np.sqrt(MyArray)))
#指定随机数种子,确保每次运行代码时的随机数可以再现,否则每次运行代码将会产生新的随机数
np.random.seed(123)
MyArray1 = np.random.randn(10)
print('MyArray1:\n{0}'.format(MyArray1))
print('MyArray1的排序结果:\n{0}'.format(np.sort(MyArray1)))
print('MyArray1四舍五入到最近的整数:\n{0}'.format(np.rint(MyArray1)))
print('MyArray1各元素非负的显示"正",负数的显示"负"\n{0}'.format(np.where(MyArray1>0,'正','负')))
print('MyArray+MyArray1的结果:\n{0}'.format(My+MyArray1))
1.3.3.4 随机数的补充说明和矩阵初步
import numpy as np
np.random.seed(123)
X = np.floor(np.random.normal(loc=5,scale=1,size=(2,5)))
Y = np.eye(5)
print('X:\n{0}'.format(X))
print('Y:\n{0}'.format(Y))
print('X和Y的积点:\n{0}'.format(np.dot(X,Y)))
X:
[[3. 5. 5. 3. 4.]
[6. 2. 4. 6. 4.]]
Y:
[[1. 0. 0. 0. 0.]
[0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]]
X和Y的积点:
[[3. 5. 5. 3. 4.]
[6. 2. 4. 6. 4.]]
X = np.floor(np.random.normal(loc=5,scale=1,size=(2,5)))
| 参数 | 类型 | 统计学含义 | 通俗解释 |
|---|---|---|---|
| loc | float | 均值 (μ) | 数据的中心位置,所有随机数整体围绕这个数值上下浮动 🎯 |
| scale | float | 标准差 (σ) | 数据的离散程度 / 波动幅度:值越小,数据越集中;值越大,数据越分散 📈 |
| size | int/tuple | 数据形状 | 生成数组的维度和大小。例如 (2, 5) 表示生成 2 行 5 列的二维数组 🧩 |
1.3.3.5 矩阵运算
import numpy as np
from numpy.linalg import inv,svd,eig,det
X = np.random.randn(5,5)
print(X)
mat = X.T.dot(X)
print(mat)
print('矩阵mat的逆:\n{0}'.format(inv(mat)))
print('矩阵mat的行列式值:\n{0}'.format(det(mat)))
print('矩阵mat的特征值和特征向量:\n{0}'.format(eig(mat)))
print('对矩阵mat做奇异值分解:\n{0}'.format(svd(mat)))
⚠️ 矩阵概念补充
-
逆矩阵 = 撤销操作 / 还原按钮
你对一张图片做了旋转 + 缩放 + 平移,逆矩阵就是把这张图变回原来样子的操作。 -
行列式 = 变换后的 “面积 / 体积放大倍数”
行列式告诉我们:这个变换把空间拉伸 / 压缩了多少倍。” -
特征向量 = 不变方向的轴;特征值 = 这个方向的拉伸倍数
特征向量 = 主方向;特征值 = 这个方向的重要程度 -
SVD = 把任何复杂矩阵,拆成 3 个简单变换:旋转 → 拉伸 → 再旋转
把复杂矩阵拆成旋转 + 拉伸,方便压缩和分析
1.3.4 学习python的Pandas包
Pandas是基于Numpy构建的Pandas数据框是存储机器学习数据集的常用形式
1.3.4.1 Pandas的序列与索引
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
data = Series([1,2,3,4,5,6,7,8,9],index=['ID1','ID2','ID3','ID4','ID5','ID6','ID7','ID8','ID9'])
print('序列中的值:\n{0}'.format(data.values))
print('序列中的索引:\n{0}'.format(data.index))
print('访问序列中第1和第3上的值:\n{0}'.format(data[[0,2]]))
print('访问索引为"ID1"和"ID3"上的值:\n{0}'.format(data[['ID1','ID3']]))
print('判断索引ID1是否存在:%s,判断ID10索引是否存在:%s'%('ID1' in data,'ID10' in data))
序列中的值:
[1 2 3 4 5 6 7 8 9]
序列中的索引:
Index(['ID1', 'ID2', 'ID3', 'ID4', 'ID5', 'ID6', 'ID7', 'ID8', 'ID9'], dtype='object')
访问序列中第1和第3上的值:
ID1 1
ID3 3
dtype: int64
访问索引为"ID1"和"ID3"上的值:
ID1 1
ID3 3
dtype: int64
判断索引ID1是否存在:True,判断ID10索引是否存在:False
1.3.4.2 Pandas 的数据框和应用
import pandas as pd
from pandas import Series,DataFrame
data = pd.read_excel('./datas.xlsx')
print('\n1、data的类型:{0}'.format(type(data)))
print('\n2、数据框的行索引:{0}'.format(data.index))
print('\n3、数据框的列名:{0}'.format(data.columns))
print('\n4、访问题号,题型编号所有的值:\n{0}'.format(data[['题号','题型编号']]))
print('\n5、访问第2行至第3行的题号和题型编号:\n{0}'.format(data.loc[1:2,['题号','题型编号']]))
print('\n6、访问索引1至索引2的第2和第4列:\n{0}'.format(data.iloc[1:3,[1,3]]))
1、data的类型:<class 'pandas.core.frame.DataFrame'>
2、数据框的行索引:RangeIndex(start=0, stop=417, step=1)
3、数据框的列名:Index(['题号', '课题专项', '单元编号', '单元内容', '题型编号', '题型描述', '题干', '答案', '分值', '拼读知识点','音标知识点', '掌握积点'],dtype='object')
4、访问题号,题型编号所有的值:
题号 题型编号
0 1 1.0
1 2 1.0
2 3 1.0
.. ... ...
416 417 NaN
[417 rows x 2 columns]
5、访问第2行至第3行的题号和题型编号:
题号 题型编号
1 2 1.0
2 3 1.0
6、访问索引1至索引2的第2和第4列:
课题专项 单元内容
1 1 长元音-/ɑː/、/ɔ:/、/ɜː/、/i:/、/u:/
2 1 长元音-/ɑː/、/ɔ:/、/ɜː/、/i:/、/u:/
1.3.4.3 Pandas加工处理
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
df1=DataFrame({'key':['a','b','c','a','b','d','c'],'val1':range(7)})
df2=DataFrame({'key':['a','b','c','c'],'val2':[0,1,2,2]})
df=pd.merge(df1,df2,on='key',how='outer')
df.iloc[0,2]=np.NaN
df.iloc[5,1]=np.NaN
print('合并后的数据:\n{0}'.format(df))
df = df.drop_duplicates()
print('\n删除重复数据行后的数据:\n{0}'.format(df))
print('\n判断是否为缺失的值:\n{0}'.format(df.isnull()))
print('\n判断是否不为缺失的值:\n{0}'.format(df.notnull()))
print('\n删除缺失值后的数据:\n{0}'.format(df.dropna()))
fill_value=df[['val1','val2']].apply(lambda x:x.mean())
print('\n以均值替换缺失值:\n{0}'.format(df.fillna(fill_value)))
合并后的数据:
key val1 val2
0 a 0.0 NaN
1 a 3.0 0.0
2 b 1.0 1.0
3 b 4.0 1.0
4 c 2.0 2.0
5 c NaN 2.0
6 c 6.0 2.0
7 c 6.0 2.0
8 d 5.0 NaN
删除重复数据行后的数据:
key val1 val2
0 a 0.0 NaN
1 a 3.0 0.0
2 b 1.0 1.0
3 b 4.0 1.0
4 c 2.0 2.0
5 c NaN 2.0
6 c 6.0 2.0
8 d 5.0 NaN
判断是否为缺失的值:
key val1 val2
0 False False True
1 False False False
2 False False False
3 False False False
4 False False False
5 False True False
6 False False False
8 False False True
判断是否不为缺失的值:
key val1 val2
0 True True False
1 True True True
2 True True True
3 True True True
4 True True True
5 True False True
6 True True True
8 True True False
删除缺失值后的数据:
key val1 val2
1 a 3.0 0.0
2 b 1.0 1.0
3 b 4.0 1.0
4 c 2.0 2.0
6 c 6.0 2.0
以均值替换缺失值:
key val1 val2
0 a 0.0 1.333333
1 a 3.0 0.000000
2 b 1.0 1.000000
3 b 4.0 1.000000
4 c 2.0 2.000000
5 c 3.0 2.000000
6 c 6.0 2.000000
8 d 5.0 1.333333
1.3.5 附录
一、Python列表基本操作
| 功能 | 函数/方法表达式 | 解释 | Demo Code |
|---|---|---|---|
| 创建列表 | list() 或 [] |
创建空列表或通过可迭代对象创建列表 | lst = [1, 2, 3] 或 lst = list(range(5)) |
| 索引访问 | lst[index] |
通过索引访问元素(支持负数索引) | lst[0] → 1;lst[-1] → 最后一个元素 |
| 切片 | lst[start:end:step] |
获取子列表(左闭右开) | lst[1:3] → [2, 3] |
| 追加元素 | lst.append(item) |
在末尾添加单个元素 | lst.append(4) → [1,2,3,4] |
| 扩展列表 | lst.extend(iterable) |
将可迭代对象元素逐个添加到末尾 | lst.extend([4,5]) → [1,2,3,4,5] |
| 插入元素 | lst.insert(index, item) |
在指定索引前插入元素 | lst.insert(1, 9) → [1,9,2,3] |
| 删除元素(值) | lst.remove(item) |
删除第一个匹配的元素 | lst.remove(2) → [1,3] |
| 删除元素(索引) | lst.pop([index]) |
删除并返回索引处的元素(默认最后) | lst.pop(0) → 返回1,列表变为 [2,3] |
| 清空列表 | lst.clear() |
清空所有元素 | lst.clear() → [] |
| 查找索引 | lst.index(item) |
返回第一个匹配项的索引 | lst.index(2) → 1 |
| 统计次数 | lst.count(item) |
返回元素出现次数 | lst.count(2) → 1 |
| 排序 | lst.sort(key=None, reverse=False) |
原地排序(默认升序) | lst.sort(reverse=True) 降序排列 |
| 反转 | lst.reverse() |
原地反转列表顺序 | lst.reverse() |
| 复制列表 | lst.copy() |
浅拷贝列表 | new_lst = lst.copy() |
| 长度 | len(lst) |
返回列表长度 | len(lst) → 3 |
| 合并列表 | lst1 + lst2 |
拼接两个列表 | [1,2] + [3,4] → [1,2,3,4] |
| 重复列表 | lst * n |
重复列表元素n次 | [1,2] * 2 → [1,2,1,2] |
二、NumPy常用函数
| 功能 | 函数表达式 | 解释 | Demo Code |
|---|---|---|---|
| 创建数组 | np.array(list) |
将列表/元组转换为ndarray | arr = np.array([1,2,3]) |
| 全零数组 | np.zeros(shape) |
创建指定形状的全0数组 | np.zeros((2,3)) → 2行3列0矩阵 |
| 全一阵列 | np.ones(shape) |
创建指定形状的全1数组 | np.ones((3,2)) |
| 单位矩阵 | np.eye(n) |
创建n×n单位矩阵 | np.eye(3) |
| 等差数组 | np.arange(start, stop, step) |
生成等差序列(类似range) | np.arange(0, 10, 2) → [0,2,4,6,8] |
| 线性间隔数组 | np.linspace(start, stop, num) |
生成等间隔的num个数 | np.linspace(0, 1, 5) → [0, 0.25, 0.5, 0.75, 1] |
| 随机数组 | np.random.rand(shape) |
生成[0,1)均匀分布的随机数组 | np.random.rand(2,3) |
| 正态分布随机 | np.random.randn(shape) |
生成标准正态分布随机数 | np.random.randn(3) |
| 形状获取 | arr.shape |
返回数组形状元组 | arr.shape → (3,) |
| 维度获取 | arr.ndim |
返回数组维度数 | arr.ndim → 1 |
| 元素总数 | arr.size |
返回数组元素总数 | arr.size → 3 |
| 数据类型 | arr.dtype |
返回数组数据类型 | arr.dtype → int64 |
| 改变形状 | arr.reshape(shape) |
改变数组形状(不改变数据) | arr.reshape(3,1) |
| 转置 | arr.T 或 arr.transpose() |
数组转置 | arr.T |
| 数组拼接 | np.concatenate([a1, a2], axis) |
沿指定轴拼接数组 | np.concatenate([arr1, arr2], axis=0) |
| 数学运算 | np.add(), np.subtract(), np.multiply(), np.divide() |
逐元素加减乘除 | np.add(arr1, arr2) |
| 求和 | arr.sum([axis]) |
沿轴求和(axis=None时全局求和) | arr.sum(axis=0) 列求和 |
| 均值 | arr.mean([axis]) |
沿轴求平均值 | arr.mean() |
| 最大值/最小值 | arr.max([axis]) / arr.min([axis]) |
沿轴求最大值/最小值 | arr.max() |
| 标准差/方差 | arr.std() / arr.var() |
计算标准差和方差 | arr.std() |
| 条件过滤 | arr[condition] |
布尔索引筛选元素 | arr[arr > 2] → 大于2的元素 |
| 矩阵乘法 | np.dot(a, b) 或 a @ b |
矩阵乘法(点积) | np.dot(A, B) |
三、Pandas常用函数
1. DataFrame常用操作
| 功能 | 函数/方法表达式 | 解释 | Demo Code |
|---|---|---|---|
| 创建DataFrame | pd.DataFrame(data, columns, index) |
从字典/列表创建DataFrame | df = pd.DataFrame({'A':[1,2], 'B':[3,4]}) |
| 读取CSV文件 | pd.read_csv(filepath) |
从CSV读取数据 | df = pd.read_csv('data.csv') |
| 查看头部数据 | df.head(n) |
查看前n行(默认5行) | df.head(3) |
| 查看尾部数据 | df.tail(n) |
查看后n行(默认5行) | df.tail(2) |
| 查看信息 | df.info() |
显示列信息、非空值数量、数据类型等 | df.info() |
| 描述性统计 | df.describe() |
数值列的统计摘要(计数、均值、标准差等) | df.describe() |
| 选择列 | df['col'] 或 df.col |
选择单列(返回Series) | df['A'] |
| 选择多列 | df[['col1','col2']] |
选择多列(返回DataFrame) | df[['A','B']] |
| 按标签选择行 | df.loc[row_label] |
通过行标签选择行(可切片) | df.loc[0] 或 df.loc[0:2] |
| 按位置选择行 | df.iloc[row_index] |
通过整数位置选择行(可切片) | df.iloc[0] |
| 条件筛选 | df[df['col'] > value] |
布尔索引筛选 | df[df['A'] > 1] |
| 添加列 | df['new_col'] = values |
添加新列 | df['C'] = df['A'] + df['B'] |
| 删除列 | df.drop('col', axis=1) |
删除指定列(axis=1为列) | df.drop('A', axis=1) |
| 删除行 | df.drop(index, axis=0) |
删除指定行(axis=0为行) | df.drop(0, axis=0) |
| 重命名列 | df.rename(columns={'old':'new'}) |
重命名列名 | df.rename(columns={'A':'AA'}) |
| 设置索引 | df.set_index('col') |
将某列设置为索引 | df.set_index('A') |
| 重置索引 | df.reset_index() |
重置索引为默认整数索引 | df.reset_index(drop=True) |
| 排序 | df.sort_values('col', ascending=False) |
按列值排序 | df.sort_values('A', ascending=False) |
| 处理缺失值 | df.dropna() / df.fillna(value) |
删除或填充缺失值 | df.fillna(0) |
| 分组聚合 | df.groupby('col').agg(func) |
按列分组并聚合 | df.groupby('A').mean() |
| 合并DataFrame | pd.merge(df1, df2, on='key') |
基于键合并两个DataFrame | pd.merge(df1, df2, on='ID') |
| 连接DataFrame | pd.concat([df1, df2], axis=0) |
沿轴拼接多个DataFrame | pd.concat([df1, df2]) |
| 应用函数 | df.apply(func) |
对行或列应用函数 | df.apply(lambda x: x.max()) |
2. Series常用操作
| 功能 | 函数/方法表达式 | 解释 | Demo Code |
|---|---|---|---|
| 创建Series | pd.Series(data, index) |
创建一维带标签数组 | s = pd.Series([1,2,3], index=['a','b','c']) |
| 索引访问 | s[index] |
通过标签或位置访问 | s['a'] 或 s[0] |
| 值统计 | s.value_counts() |
统计唯一值频次 | s.value_counts() |
| 映射替换 | s.map(dict_or_func) |
根据映射替换值 | s.map({1:'一', 2:'二'}) |
| 判断是否在列表 | s.isin(list) |
检查元素是否在列表中 | s.isin([1,3]) |
更多推荐
所有评论(0)