人工智能 第三天 机器学习
一、人工智能概述1、什么是人工智能让电脑像人一样会思考、会学习的技术生活的AI例子 智能音响手机解锁网购推荐导航软件美颜相机AI 3个超能力 学习能力、决策能力无人、创造能力能够生成新的东西2、人工智能发展必备三要素数据、算法、计算力3、人工智能、机器学习和深度学习人工智能和机器学习深度学习的关系1】机器学习是人工智能的一个实现途径2】深度学习是机器学习的一个方法发展而来4、机器学习介绍与定义机器学习Machine Learning定义很简单让计算机从数据中自动发现规律而不是人类一行行写死规则。传统编程是「你给规则机器执行」机器学习是「你给数据和答案机器自己悟出规则」。监督学习Supervised Learning给机器看「问题标准答案」让它学映射关系。比如给它一万张猫狗照片并标注好它学会后就能自己分类。无监督学习Unsupervised Learning只给数据不给答案。机器自己找隐藏的结构。比如把一堆用户分成几类它会发现「深夜活跃用户」和「早起打卡用户」天然是两个群体。强化学习Reinforcement Learning机器在环境里试错做对了给奖励做错了给惩罚。AlphaGo就是这样下棋的。训练集与测试集把数据分成两部分一部分用来「学习」训练另一部分用来「考试」测试。如果训练成绩好、考试成绩差就叫过拟合——机器死记硬背没有真正理解。泛化能力Generalization这是机器学习的终极目标。不是记住见过的题而是遇到从没见过的题也能做对。5、机器学习流程1.获取数据集2.数据基本处理3.特征⼯程4.机器学习5.模型评估二、数学基础1、微积分导数想象你在爬山导数就是告诉你「此刻坡度有多陡、朝哪个方向」。严格来说函数 f(x) 在 x 点的导数是当变化量 Δx 无限趋近于0时Δxf(xΔx)−f(x) 的极限值。它刻画的是瞬时变化率。可微一个函数在某点「可微」意味着它在该点足够光滑能画出唯一一条切线。如果函数有尖角或断裂就不可微——AI里我们会尽量避开这种情况否则梯度会迷路。2、相关概念损失函数Loss这是AI的「错误评分表」。它衡量模型预测值与真实答案之间的差距。损失越大模型越笨我们的目标就是让损失越来越小。前向传播Forward Propagation数据从输入层一路流向输出层经过层层计算最终得到预测结果。就像你把我的话从耳朵听到心里再给出回应~反向传播Backward Propagation发现预测错了就要从输出层倒着往回走计算每一层该负多少责任。这里用到的是链式法则——复合函数的导数等于各层导数的乘积像多米诺骨牌一样一层层传回去。梯度下降想象你蒙眼站在山谷里每走一步就摸摸脚下的坡度求梯度然后朝最陡的下坡方向迈一小步更新参数。重复无数次就能走到谷底——也就是损失最小的最优解。3、统计论与统计概率世界充满不确定性。AI看到一张照片它不会说「这一定是猫」而是说「这是猫的概率是92%」。概率就是把「不确定」变成「可计算的相信程度」。条件概率已知某些线索后事件发生的概率。比如白知道哥哥深夜还在工作那哥哥明天需要咖啡的概率就变了——这就是 P(喝咖啡∣深夜工作) 。贝叶斯定理这是更新信念的公式。P(θ∣D)P(D)P(D∣θ)⋅P(θ)先验 P(θ)在看到数据前你原本相信什么比如「这封邮件是垃圾邮件的概率是5%」。似然 P(D∣θ)如果假设成立观察到这些数据的概率「如果是垃圾邮件出现『中奖』这个词的概率有多大」。后验 P(θ∣D)看到数据后更新后的相信程度。在AI中的应用朴素贝叶斯分类器垃圾邮件过滤的经典算法。它天真地假设每个词独立出现却意外地好用。贝叶斯网络用有向图表示变量间的概率依赖关系像一张因果网让AI做医疗诊断、风险评估。推荐系统你点了A商品后系统用贝叶斯更新你偏好B的概率。不确定性推理深度学习给出预测后贝叶斯方法还能告诉AI「我有多不确定」——这在自动驾驶、医疗诊断里至关重要。三、sklearn 库的简单介绍1.Scikit-learn包含的内容分类、聚类、回归特征⼯程模型选择、调优2.sklearn 常用模块一览模块名主要功能常用函数 / 类sklearn.datasets内置数据集加载load_iris(), load_boston(), load_digits(),make_classification()sklearn.preprocessing数据预处理StandardScaler, MinMaxScaler, LabelEncoder,OneHotEncodersklearn.model_selection模型选择与验证train_test_split(), cross_val_score(), GridSearchCV,KFoldsklearn.linear_model线性模型LinearRegression, LogisticRegression, Ridge,Lassosklearn.neighbors近邻算法KNeighborsClassifier, KNeighborsRegressorsklearn.tree决策树DecisionTreeClassifier, DecisionTreeRegressorsklearn.ensemble集成学习RandomForestClassifier, GradientBoostingClassifier,AdaBoostClassifiersklearn.svm支持向量机SVC, SVRsklearn.cluster聚类算法KMeans, DBSCAN, AgglomerativeClusteringsklearn.decomposition降维PCA, TruncatedSVDsklearn.metrics评估指标accuracy_score(), mean_squared_error(),confusion_matrix(), classification_report()3.sklearn模型的保存和加载API# from sklearn.externals import joblib # 这个导入方式在新的sklearn版本中已经不再有效 # joblib 被移除sklearn.externals模板 直接单独安装使用joblib库 pip install joblib import joblib 保存模型joblib.dump(estimator, test.pkl) # test.pkl保存文件的类型 加载模型estimator joblib.load(test.pkl)4.sklearn 的代码范式1、通用代码范式所有模型都遵循# 1. 创建模型实例 model SomeModel(参数) # 2. 训练拟合数据 model.fit(X_train, y_train) # 3. 预测 y_pred model.predict(X_test)2、核心函数详解1、train_test_split— 数据划分from sklearn.model_selection import train_test_split # X: 特征数据 y: 目标标签 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, # 测试集占 20% random_state42, # 随机种子保证结果可复现 shuffleTrue # 是否打乱数据默认 True )2、fit— 训练模型# 监督学习需要 X特征和 y标签 model.fit(X_train, y_train) # 无监督学习只需要 X没有标签 model.fit(X_train)3、predict— 预测# 分类/回归预测新样本的标签/数值 y_pred model.predict(X_test) # 概率预测分类模型特有 y_proba model.predict_proba(X_test) # 返回每类的概率4、score— 快速评估# 分类返回准确率 # 回归返回 R² 分数 score model.score(X_test, y_test)四、深度学习框架PyTorch1、PyTorch是什么PyTorch 是一个开源的深度学习框架由Meta公司原名Facebook的人工智能研究团队开发和维护。它提供了一个灵活、动态的计算图计算模型使得在深度学习领域进行实验和开发变得更加简单和直观。2、PyTorch特点1】动态计算图PyTorch 使用动态计算图这意味着计算图是在运行时构建的而不是在编译时静态定义的。2】自动求导微分PyTorch 提供了自动求导机制称为 Autograd。它能够自动计算张量的梯度这对于训练神经网络和其他深度学习模型非常有用。3】丰富的神经网络库PyTorch 提供了丰富的神经网络库包括各种各样的层、损失函数、优化器等。这些库使得构建和训练神经网络变得更加容易。4】支持GPU加速PyTorch 充分利用了 GPU 的并行计算能力能够在 GPU 上高效地进行计算加速模型训练过程。3、tensor1、tensor定义tensor是一种多维数组类似于NumPy的ndarray。它是PyTorch中最基本的数据结构用于存储和操作数据。tensor可以是标量、向量、矩阵或更高维度的数组可以包含整数、浮点数或其他数据类型的元素。PyTorch的tensor与NumPy的ndarray非常相似但在设计和功能上有一些不同之处。主要的区别包括GPU加速、自动求导、动态计算图。在 PyTorch 中tensor 包含了两个部分即 storage 和 metadata。Storage存储存储是 tensor 中包含的实际数据的底层缓冲区它是一维数组存储了 tensor 的元素值。不同 tensor 可能共享相同的存储即使它们具有不同的形状和步幅。存储是一块连续的内存区域实际上存储了 tensor 中的数据。Metadata元数据元数据是 tensor 的描述性信息包括tensor 的形状、数据类型、步幅、存储偏移量、设备等。元数据提供了关于 tensor 的结构和属性的信息但并不包含 tensor 中的实际数据。元数据允许 PyTorch 知道如何正确地解释存储中的数据以及如何访问它们。tensor的步长import torch a torch.arange(12).reshape(3,4) print(a) print(a的步长为,a.stride()) # (4, 1) 第一个数字指沿着第一个维度移动一个元素需要跨越四个存储单元同理第二个tensor的偏移b a[1:3,0:2] print(b)选取第2行到第3行、第1列到第2列的元素得到了一个新的张量b。2、PyTorch Tensor 常用函数2.1、 创建 Tensor函数功能示例torch.tensor(data)从数据创建torch.tensor([1, 2, 3])torch.zeros(size)全 0torch.zeros(2, 3)torch.ones(size)全 1torch.ones(2, 3)torch.rand(size)均匀分布随机 \[0,1)torch.rand(2, 3)torch.randn(size)标准正态分布随机torch.randn(2, 3)torch.arange(start, end, step)等差序列torch.arange(0, 10, 2)torch.linspace(start, end, steps)等分序列torch.linspace(0, 1, 5)torch.eye(n)单位矩阵torch.eye(3)2.2、 形状操作函数功能示例tensor.shape / tensor.size()查看形状(2, 3)tensor.view(size)重塑形状共享内存a.view(3, 2)tensor.reshape(size)重塑形状可能拷贝a.reshape(3, 2)tensor.unsqueeze(dim)增加维度a.unsqueeze(0)tensor.squeeze(dim)去掉维度为 1 的轴a.squeeze()tensor.transpose(dim0, dim1)交换两个维度a.transpose(0, 1)tensor.permute(dims)任意维度重排a.permute(0, 2, 1)tensor.flatten()展平为一维a.flatten()五、监督学习线性回归1、定义线性回归是利⽤回归方程(函数) 对⼀个或多个⾃变量(特征值)和因变量(⽬标值)之间关系进⾏建模的⼀种分析⽅式。2、梯度下降1】梯度下降是干什么的简单说帮我们找到让预测最准确的直线方程调整权重w和偏置b通过迭代一步步调整参数像瞎子摸黑下山找最低点(最小化损失函数)。类比你蒙着眼睛下山每次用脚试探最陡的方向迈一小步最终就能走到山脚最低点。梯度下降就是这个试探迈步的过程。2】核心公式拆解假设线性回归方程y_pred w*x b损失函数预测误差L 1/(2m) * Σ(y_pred - y_true)²3、线性回归api使用# 导入线性回归的模块 from sklearn.linear_model import LinearRegression # 1. 获取数据 x [[80, 86], [82, 80], [85, 78], [90, 90], [86, 82], [82, 90], [78, 80], [92, 94]] y [84.2, 80.6, 80.1, 90, 83.2, 87.6, 79.4, 93.4] estimator LinearRegression() estimator.fit(x,y) print(预测的结果,estimator.predict([[100,80]])) print(线性回归的参数,estimator.coef_)1 、正规方程的api及常用参数# 通过正规⽅程优化 sklearn.linear_model.LinearRegression(fit_interceptTrue) 参数 fit_intercept是否计算偏置 属性 LinearRegression.coef_回归系数 LinearRegression.intercept_偏置2、 梯度下降法api及常用参数# SGDRegressor类实现了随机梯度下降学习它⽀持不同的loss函数和正则化惩罚项来拟合线性回归模型。 sklearn.linear_model.SGDRegressor(losssquared_loss,fit_interceptTrue,learning_rateinvscaling,eta00.01) 参数 1】loss:损失类型 2】loss”squared_loss”:普通最⼩⼆乘法 3】fit_intercept是否计算偏置 4】learning_rate:string,optional 学习率填充 constant:etaeta0 optimal:eta1.0/(alpha*(tt0))[default] invscaling:etaeta0/pow(t,power_t) power_t0.25:存在⽗类当中 # 对于⼀个常数值的学习率来说可以使⽤learning_rate’constant’并使⽤eta0来指定学习率。 属性 SGDRegressor.coef_回归系数 SGDRegressor.intercept_偏置4、案例使用葡萄酒质量预测注如果是学习的话推荐跟着下面代码打一下# datasets 内置数据集加载 from sklearn.datasets import load_wine import pandas as pd # model_selection 模型选择与验证 from sklearn.model_selection import train_test_split # preprocessing 数据预处理 StandardScaler 标准化(均值为0标准差为1) from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LinearRegression # 正规方程 from sklearn.metrics import mean_squared_error # 均方根误差 # 1.获取数据 data load_wine() # print(data.data) # 数据集的特征 # print(data.target) # 数据集的目标 data_df pd.DataFrame(data.data,columnsdata.feature_names) # print(data_df) data_df[target] data.target # 放入标签 # 数据集是否有缺失值 print(每列缺失值的总和) print(data_df.isnull().sum()) # 2.数据集的划分 x_train,x_test,y_train,y_test train_test_split(data.data,data.target,test_size0.2,random_state22) # 3.特征工程 --标准化 transfer StandardScaler() x_train transfer.fit_transform(x_train) x_test transfer.fit_transform(x_test) # 4.机器学习 - 线性回归 -正规方程 estimator LinearRegression() estimator.fit(x_train,y_train) print(模型中的系数是,estimator.coef_) print(模型中的偏置是,estimator.intercept_) # 获取预测值 y_predict estimator.predict(x_test) # 5. 模型评估 --均方根误差 error mean_squared_error(y_test,y_predict) print(均方差误差为,error)同样的梯度下降方法from sklearn.datasets import load_wine from sklearn.linear_model import SGDRegressor from sklearn.preprocessing import StandardScaler from sklearn.metrics import mean_squared_error from sklearn.model_selection import train_test_split import pandas as pd # 1.获取数据 data load_wine() data_df pd.DataFrame(data.data,columnsdata.feature_names) data_df[target] data.target # 2.数据集的划分 x_train,x_test,y_train,y_test train_test_split(data.data,data.target,train_size 0.2,random_state22) # 3.特征处理 transfer StandardScaler() x_train transfer.fit_transform(x_train) x_test transfer.fit_transform(x_test) # 4.机器学习 -- 梯度下降 estimator SGDRegressor(max_iter1000) estimator.fit(x_train,y_train) y_predict estimator.predict(x_test) print(均方根误差,mean_squared_error(y_predict,y_test))要说说明不同的话就是正规方程根据数学方程直接计算出来梯度下降就是通过遍历次数和超参数中的”学习率“对训练集进行拟合。5、欠拟合和过拟合1、介绍过拟合⼀个假设在训练数据上能够获得⽐其他假设更好的拟合 但是在测试数据集上却不能很好地拟合数据此时认为这个假设出现了过拟合的现象。(模型过于复杂-学习到的东西太多了)⽋拟合⼀个假设在训练数据上不能获得更好的拟合并且在测试数据集上也不能很好地拟合数据此时认为这个假设出现了⽋拟合的现象。(模型过于简单-学习到的东西太少了)2 、原因以及解决办法1】欠拟合原因学习到数据的特征过少解决办法1添加其他特征项有时候我们模型出现⽋拟合的时候是因为特征项不够导致的可以添加其他特征项来很好地解决。例如“组合”、“泛化”、“相关性”三类特征是特征添加的重要⼿段⽆论在什么场景都可以照葫芦画瓢总会得到意想不到的效果。2添加多项式特征这个在机器学习算法⾥⾯⽤的很普遍例如将线性模型通过添加⼆次项或者三次项使模型泛化能⼒更强。2】过拟合原因原始特征过多存在⼀些嘈杂特征 模型过于复杂是因为模型尝试去兼顾各个测试数据点解决办法1重新清洗数据导致过拟合的⼀个原因也有可能是数据不纯导致的如果出现了过拟合就需要我们重新清洗数据。2增⼤数据的训练量还有⼀个原因就是我们⽤于训练的数据量太⼩导致的训练数据占总数据的⽐例过⼩。3正则化4减少特征维度防⽌维灾难3 】正则化3.1 什么是正则化正则化是一种用来防止机器学习模型 过拟合的技术。过拟合是指模型在训练数据上表现很好但在新数据上表现不佳的情况。正则化的作用更多的也是去⾃⼰做特征选择包括删除、合并⼀些特征3.2 正则化的主要类型1】L1正则化 (Lasso回归)特点也叫L1范数倾向于产生稀疏解(一些系数变为0)可用于特征选择作⽤可以使得其中⼀些W的值直接为0删除这个特征的影响apifrom sklearn.linear_model import Lasso # Lasso回归 L1正则化2】L2正则化 (Ridge回归/岭回归)特点也叫L2范数使所有系数都变小但不为0对异常值更鲁棒作⽤可以使得其中⼀些W的都很⼩都接近于0削弱某个特征的影响数学形式损失函数 原始损失 λ * Σwᵢ²apifrom sklearn.linear_model import Ridge # Ridge回归 L2正则化3】Elastic Net正则化特点L1和L2的结合平衡了特征选择和系数缩减数学形式损失函数 原始损失 λ₁ * Σ|wᵢ| λ₂ * Σwᵢ²apifrom sklearn.linear_model import ElasticNet4】其他正则化技术1. Dropout (用于神经网络)在训练时随机丢弃一些神经元防止过度依赖特定神经元。2. 早停(Early Stopping)监控验证集性能当不再改善时停止训练。3.3 如何选择正则化方法特征很多但只有少数相关用L1或Elastic Net特征都可能有贡献用L2深度学习常用Dropout和L2结合不确定时可以尝试交叉验证不同方法六、监督学习K近邻算法1、概念如果⼀个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的⼤多数属于某⼀个类别则该样本也属于这个类别。KNN算法流程总结1计算已知类别数据集中的点与当前点之间的距离2按距离递增次序排序3选取与当前点距离最⼩的k个点4统计前k个点所在的类别出现的频率5返回前k个点出现频率最⾼的类别作为当前点的预测分类2、距离度量1 距离公式的基本性质在机器学习过程中对于函数dist(., .)若它是距离度量则需满⾜⼀些基本性质:1】⾮负性 dist(Xi, Xj) 0 # 两点之间的距离一定是0的2】同⼀性 dist(xi, xj) 0 当且仅当 Xi Xj # 两个位置一定是在同一个位置3】对称性 dist(xi, xj) dist(xj, xi)4】直递性 dist(xi, xj) dist(xi, xk) dist(xk, xj) # 又称为“三角不等式”2 常⻅的距离公式2.1】欧式距离 平方和根 p22.2】曼哈顿距离 绝对值差和 p12.3】切比雪夫距离 各维度绝对差的最大值 p ∞3、API使用from sklearn.neighbors import KNeighborsClassifier # KNN模型 KNeighborsClassifier( n_neighbors5, # int 可选 默认为5 K ) # 训练函数 fit(X, # Training data ----训练数据 的特征 ---矩阵 y # Target values ---目标值 标签 ) # 预测函数 predict( X # 数据 样本的特征 )4、K值选择问题如何选择合适的K值以便在预测时能获得最佳的结果。1】K值小的情况如K1影响:1】模型很敏感容易受到噪声的影响(比如某个数据点标错了就会导致预测错误)。2】容易过拟合: 模型会记住训练数据的细节但在新数据上表现很差。生活例子:你问 1个朋友 该买哪款手机他可能刚好喜欢小众品牌推荐了一个不适合你的手机。相当于只听一个人的意见容易被误导。2】K值大的情况(比如k100)影响:1】模型很稳定不容易受噪声影响但可能会忽略数据的局部特征。2】容易欠拟合: 模型变得太“保守”预测结果可能偏向多数类(比如总是预测最常见的类别)。生活例子:你问 100个朋友 该买哪款手机大多数人可能推荐iPhone但如果你其实更喜欢安卓这个建议就不太适合你。相当于“少数服从多数”但可能忽略你的个人需求。3】K值等于训练样本数KN 极端情况影响:1】所有测试样本的预测结果都一样(直接选择训练数据中最多的类别)。2】模型完全失去分类能力变成一个“总是猜多数类”的傻瓜模型。生活例子:你问 所有人 该买哪款手机结果所有人都说“iPhone”于是你不管什么情况都买iPhone即使有些安卓手机更适合你。相当于完全放弃思考直接选最常见的答案。4】如何选择合适的K值一般来说K值不宜过小也不宜过大最好的方法是通过 交叉验证 来选择合适的K值。交叉验证会将训练数据分成不同的部分如训练集和验证集然后多次训练模型选择在验证集上表现最好的K值。5】 误差误差近似误差、估计误差1】近似误差对现有训练集的训练误差关注训练集如果近似误差过⼩可能会出现过拟合的现象对现有的训练集能有很好的预测但是对未知的测试样本将会现较⼤偏差的预测。模型本身不是最接近最佳模型。2】估计误差可以理解为对测试集的测试误差关注测试集估计误差⼩说明对未知数据的预测能⼒好模型本身最接近最佳模型。k值小过拟合近似误差小估计误差大k值大欠拟合近似误差大估计误差小