机器学习

机器学习与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.dtypeint64
改变形状 arr.reshape(shape) 改变数组形状(不改变数据) arr.reshape(3,1)
转置 arr.Tarr.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])

更多推荐