机器学习三要素
任何一个机器学习方法都是由模型(model)、策略(strategy)和算法(algorithm)三个要素构成的,具体可理解为机器学习模型在一定的优化策略下使用相应求解算法来达到最优目标的过程。
模型
机器学习的第一个要素是模型。机器学习中的模型就是要学习的决策函数或者条件概率分布,一般用假设空间(hypothesis space)来描述所有可能的决策函数或条件概率分布 。
策略
机器学习的第二个要素是策略。简单来说,就是在假设空间的众多模型中,机器学习需要按照什么标准选择最优模型。对于给定模型,模型输出和真实输出之间的误差可以用一个损失函数(loss function)来度量。不同的机器学习任务都有对应的损失函数,回归任务一般使用均方误差,分类任务一般使用对数损失函数或者交叉熵损失函数等。
算法
机器学习的最后一个要素是算法。作为机器学习三要素之一的算法,指的是学习模型的具体优化方法。当机器学习的模型和损失函数确定时,机器学习就可以具体地形式化为一个最优化问题,可以通过常用的优化算法,比如随机梯度下降法、牛顿法、拟牛顿法等进行模型参数的优化求解。
机器学习核心
机器学习的目的在于训练模型,使其不仅能够对已知数据而且能对未知数据有较好的预测能力。当模型对已知数据预测效果很好但对未知数据预测效果很差的时候,就引出了机器学习的核心问题之一:过拟合
监督学习核心
其中第一项为针对训练集的经验误差项,即我们常说的训练误差;第二项为正则化项,也称惩罚项,用于对模型复杂度的约束和惩罚。所以,所有监督机器学习的核心任务无非就是正则化参数的同时最小化经验误差。(也就是模型越简单,且效果越好)
第一项经验误差项很重要,可以改变模型的形式。 当第一项是平方损失(square loss)时,机器学习模型便是线性回归;当第一项变成指数损失(exponential loss)时,模型则是著名的AdaBoost(一种集成学习树模型算法);而当损失函数为合页损失(hinge loss)时,便是大名鼎鼎的SVM了。
过拟合是指模型在训练集上表现良好,但是在测试集上表现差。(过拟合是指模型不仅学习到数据中的一般规律,而且连数据中的噪声也学习了)。为了应对过拟合,常用的方法:特征工程,扩大训练集数量
机器学习流程
需求分析
确定机器学习的目标,输入是什么,输出是什么。关键的性能指标有哪些。
数据采集
数据获取至关重要
数据清洗
在实际工作过程中,可能有些数据比较脏,出现了丢失,或者有些数据偏大偏小(不正常的点,在采集过程中出现的各种错误影响的)。这一部分,甚至占项目的大部分时间。
数据分析与可视化
数据清洗完之后,需要对数据进行分析。数据都有哪些特征?是否有很多类别特征?目标变量分布如何?各自变量与目标变量的关系是否需要可视化展示?数据中各变量缺失值的情况如何?怎样处理缺失值?
选择模型并且训练
数据初步分析完后,对数据就会有一个整体的认识,一般就可以着手训练机器学习模型了。但是训练完一个基线模型之后,需要对模型进行调参和优化。
模型的测试
模型在测试集上的关键性能指标
模型的上线
将模型部署到设备上。
numpy基础
NumPy是一个用于大规模矩阵和数组运算的高性能Python计算库,广泛应用于Python矩阵运算和数据处理,在机器学习中也有大量应用。NumPy的基本用法包括创建数组、索引与切片、基础运算、维度变换和数组合并与切分等内容。
创建数组
NumPy通过array方法将常规的列表(list)和元组(tuple)等数据结构转化为数组。
# 导入numpy模块
import numpy as np
# 将整数列表转换为NumPy数组
a = np.array([1,2,3])
# 查看整数数组对象类型
print(a.dtype)
zeros方法用于创建全0数组,ones方法用于创建全1数组,empty方法用于创建未初始化的随机数数组,arange方法用于创建给定范围内的数组
rand方法用于生成符合(0, 1)均匀分布的随机数数组,randint方法用于生成指定范围内固定长度的整数数组,而randn用于生成符合标准正态分布的随机数数组
# 导入numpy模块
import numpy as np
# 生成2×3的全0数组
print(np.zeros((2, 3)))
# 生成3×4的全1数组
print(np.ones((3, 4), dtype=np.int16))
# 生成2×3的随机数数组
print(np.empty([2, 3]))
# arange方法用于创建给定范围内的数组
print(np.arange(10, 30, 5 )) #创建10-30,步长为5,不包括30
# 生成3×2的符合(0,1)均匀分布的随机数数组
print(np.random.rand(3,2))
# 生成0到2范围内长度为5的数组
print(np.random.randint(low=0,high=3, size=5))
# 生成一组符合标准正态分布的随机数数组
print(np.random.randn(3,3))
数组的索引与切片
# 导入numpy模块
import numpy as np
a=np.random.randn(3,3)
print(a.dtype)
# 获取数组的第3行元素
print(a[2])
# 获取第0行到第1行数组元素
print(a[0:2,:])
# 反转
print(a[::-1,:])
数组的基础运算
# 导入numpy模块
import numpy as np
a=np.random.randn(3,3)
# 计算数组的平方
print('计算数组的平方',a**2)
# 计算数组的正弦值
print('计算数组的正弦值',np.sin(a))
# 数组的逻辑运算
print('数组的逻辑运算',a<0)
print('计算数组的均值',np.mean(a))
print('计算数组的方差',np.var(a))
数组线性代数运算
# 导入numpy模块
import numpy as np
# 创建两个不同的数组
A = np.array([[1,1],
[0,1]])
B = np.array([[2,0],
[3,4]])
# 矩阵元素乘积
print('矩阵元素乘积',A * B)
# 矩阵点乘
print('矩阵点乘',A.dot(B))
# 矩阵求逆
print('矩阵求逆',np.linalg.inv(A))
# 矩阵求行列式
print('矩阵求行列式',np.linalg.det(A))
数组维度变换
# 导入numpy模块
import numpy as np
# 创建一个3×4的数组 np.floor()函数是取整函数
a = np.floor(10*np.random.random((3,4)))
# 查看数组维度
print('数组维度',a.shape)
# 数组展平
print('数组展平',a.ravel())
# 将数组变换为2×6数组,,如果是-1会自动计算
print('将数组reshape成2*6',a.reshape(2,6))
# 求数组的转置
print('数组的转置',a.T)
# 按行合并
print('按行合并',np.hstack((a,a)).shape,'合并之前的',a.shape)
#按列合并
print('按列合并',np.vstack((a,a)).shape,'合并之前的',a.shape)
# 按水平方向将数组C切分为两个数组
print('分割',np.hsplit(a ,2))
sklearn
sklearn是Python机器学习的核心模型与算法库,其全称为scikit-learn,模型和算法实现主要建立在NumPy、SciPy和matplotlib等Python核心库上,对主流的监督学习和无监督学习模型与算法均有较好的支持。
其中有六大核心模块——分类、回归、聚类、降维、模型选择和预处理,基本实现了对机器学习的全方位覆盖
# 导入iris数据集和逻辑回归算法模块
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
# 导入数据
X, y = load_iris(return_X_y=True)
print('X.shape',X.shape)
# print('y的值',y)
# 定义模型
clf = LogisticRegression()
#训练模型
clf.fit(X, y)
print(X[:2,:].shape)
# 预测
print(clf.predict(X[:2,]))
# 概率预测
print('概率预测',clf.predict_proba(X[:2, :]))
# 模型准确率
print('模型的准确率',clf.score(X, y))
X.shape (150, 4)
y的值 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 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 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2]
(2, 4)
[0 0]
概率预测 [[9.81798885e-01 1.82011004e-02 1.43499227e-08]
[9.71721788e-01 2.82781823e-02 3.00194617e-08]]
模型的准确率 0.9733333333333334