当前位置: 首页 > news >正文

网站的动画效果代码大全上海注册公司注册资金

网站的动画效果代码大全,上海注册公司注册资金,闸北网站建设公司,网络推广公司加盟机器学习概述 机器学习#xff08;Machine Learning, ML#xff09;主要研究计算机系统对于特定任务的性能#xff0c;逐步进行改善的算法和统计模型。通过输入海量训练数据对模型进行训练#xff0c;使模型掌握数据所蕴含的潜在规律#xff0c;进而对新输入的数据进行准确…机器学习概述 机器学习Machine Learning, ML主要研究计算机系统对于特定任务的性能逐步进行改善的算法和统计模型。通过输入海量训练数据对模型进行训练使模型掌握数据所蕴含的潜在规律进而对新输入的数据进行准确的分类或预测。 机器学习是一门多领域交叉学科涉及概率论、统计学、逼近论、凸优化、算法复杂度理论等多门学科。 人工智能、机器学习与深度学习 人工智能AI是计算机科学的一个广泛领域目标是让机器具备类人的“智能”包括自然语言处理NLP、计算机视觉、机器人技术、专家系统等等具体实现手段多种多样包括规则系统、符号逻辑、统计方法、机器学习等。 机器学习是AI的一个子领域核心是通过数据驱动让计算机进行学习并改进性能自动发现规律模式并利用这些规律进行预测或决策。 深度学习是机器学习的一个子领域基于多层神经网络处理复杂任务。 发展历史了解 早期探索20世纪50-70年代 人工智能研究处于“推理期”人们认为只要能赋予机器逻辑推理能力机器就能具有智能。 图灵提出“图灵测试”定义机器智能的基本标准 弗兰克·罗森布拉特提出感知机算法这是最早的人工神经网络模型之一用于线性分类问题 亚瑟·李·塞谬尔提出“机器学习”一词并设计了一个用于玩跳棋的学习算法 知识驱动与专家系统20世纪70-80年代 随着研究推进人们逐渐认识到仅具有逻辑推理能力是远远实现不了人工智能的。部分人认为要使机器具有智能就必须设法使机器拥有知识。计算机硬件逐步发展人工智能的研究进入以规则为主的“知识驱动”阶段。 出现众多专家系统如MYCIN用于医疗诊断 引入了决策树如ID3算法 统计学习理论开始成形例如贝叶斯定理在机器学习中的应用 数据驱动与统计学习20世纪80年代-21世纪 专家系统面临“知识工程瓶颈”。机器学习成为一个独立的学科领域各种机器学习技术百花初绽。基于神经网络的连接主义逐步发展但其局限性也开始凸显。统计学习登场并占据主流代表技术是支持向量机。互联网的发展带来了大量数据统计学方法逐渐成为机器学习的核心。 决策树算法得到进一步发展如C4.5算法 支持向量机SVM被提出成为一种强大的分类工具 无监督学习方法开始成熟例如K-means聚类 随机森林和Boosting方法如AdaBoost引入提升了集成学习的性能 深度学习崛起21世纪初 随着计算能力特别是GPU的发展和数据规模的快速增长深度学习技术得以崛起。深度神经网络主导突破了图像、语音和文本领域的性能瓶颈。 深度信念网络DBN被提出标志着深度学习研究的复兴 AlexNet在ImageNet图像分类竞赛中获胜证明了卷积神经网络CNN的强大性能 生成对抗网络GAN被提出用于生成图像和其他生成任务 Transformer架构在论文《Attention is All You Need》中提出彻底改变了自然语言处理领域 大模型与通用人工智能2020年代 深度学习进入规模化应用阶段大语言模型和多模态模型的出现推动了机器学习的新高潮。模型参数规模空前技术以通用性和泛化能力为目标。 自然语言处理如OpenAI的GPT系列模型、Google的BERT 多模态模型如OpenAI的CLIP、DeepMind的Gato 自监督学习成为重要方向降低了对人工标注数据的依赖 强化学习和深度学习结合应用于AlphaGo、AlphaFold等项目 机器学习应用领域 今天在计算机科学的诸多分支学科领域中无论是多媒体、图形学还是网络通信、软件工程乃至体系结构、芯片设计都能找到机器学习技术的身影尤其是在计算机视觉、自然语言处理等计算机应用技术领域机器学习已成为最重要的技术进步源泉之一并为许多交叉学科提供了重要的技术支撑。 基本术语 数据集Data Set多条记录的集合。 训练集Tra条记录是关于一个事件或对象的描述称为一个样本。 特征Feature数据集中一列反映事件或对象在某方面的表现或性质的事项称为特征或属性。 特征向量Feature Vector将样本的所有特征表示为向量的形式输入到模型中。 标签Label监督学习中每个样本的结果信息也称作目标值target。 模型Model一个机器学习算法与训练后的参数集合用于进行预测或分类。 参数Parameter模型通过训练学习到的值例如线性回归中的权重和偏置。 超参数Hyper Parameter由用户设置的参数不能通过训练自动学习例如学习率、正则化系数等。机器学习基本理论 机器学习三要素 机器学习的方法一般主要由三部分构成模型、策略和算法可以认为 机器学习方法 模型 策略 算法 模型model总结数据的内在规律用数学语言描述的参数系统 策略strategy选取最优模型的评价准则 算法algorithm选取最优模型的具体方法 机器学习方法分类 机器学习的方法种类繁多并不存在一个统一的理论体系能够涵盖所有内容。从不同的角度可以将机器学习的方法进行不同的分类 通常分类按照有无监督机器学习可以分为 有监督学习、无监督学习 和 半监督学习除此之外还有 强化学习。 按模型分类根据模型性质可以分为概率模型/非概率模型线性/非线性模型等。 按学习技巧分类根据算法基于的技巧可以分为贝叶斯学习、核方法等。 各种类型的机器学习方法可以用下图汇总展示 建模流程 我们可以以监督学习为例考察一下机器学习的具体过程。 可以看到机器学习是由数据驱动的核心是利用数据来“训练模型”模型训练的结果需要用一定的方法来进行评估、优化最终得到一个成熟的学习模型最后就可以用这个模型来进行预测和解决问题了。 总结监督学习建模的整体流程如下 特征工程 什么是特征工程 特征工程Feature Engineering是机器学习过程中非常重要的一步指的是通过对原始数据的处理、转换和构造生成新的特征或选择有效的特征从而提高模型的性能。简单来说特征工程是将原始数据转换为可以更好地表示问题的特征形式帮助模型更好地理解和学习数据中的规律。优秀的特征工程可以显著提高模型的表现反之忽视特征工程可能导致模型性能欠佳。 实际上特征工程是一个迭代过程。特征工程取决于具体情境。它需要大量的数据分析和领域知识。其中的原因在于特征的有效编码可由所用的模型类型、预测变量与输出之间的关系以及模型要解决的问题来确定。在此基础上辅以不同类型的数据集如文本与图像则可能更适合不同的特征工程技术。因此要具体说明如何在给定的机器学习算法中最好地实施特征工程可能并非易事。 特征工程的内容 特征选择 从原始特征中挑选出与目标变量关系最密切的特征剔除冗余、无关或噪声特征。这样可以减少模型的复杂度、加速训练过程、并减少过拟合的风险。 特征选择不会创建新特征也不会改变数据结构。 过滤法Filter Method 基于统计测试如卡方检验、相关系数、信息增益等来评估特征与目标变量之间的关系选择最相关的特征。 包裹法Wrapper Method 使用模型如递归特征消除 RFE来评估特征的重要性并根据模型的表现进行特征选择。 嵌入法Embedded Method 使用模型本身的特征选择机制如决策树的特征重要性L1正则化的特征选择来选择最重要的特征。 特征转换 对数据进行数学或统计处理使其变得更加适合模型的输入要求。 归一化Normalization 将特征缩放到特定的范围通常是0到1之间。适用于对尺度敏感的模型如KNN、SVM。 标准化Standardization 通过减去均值并除以标准差使特征的分布具有均值0标准差1。 对数变换 对于有偏态的分布如收入、价格等对数变换可以将其转化为更接近正态分布的形式。 类别变量的编码 独热编码One-Hot Encoding将类别型变量转换为二进制列常用于无序类别特征。 标签编码Label Encoding将类别型变量映射为整数常用于有序类别特征。 目标编码Target Encoding将类别变量的每个类别替换为其对应目标变量的平均值或其他统计量。 频率编码Frequency Encoding将类别变量的每个类别替换为该类别在数据集中的出现频率。 特征构造 特征构造是基于现有的特征创造出新的、更有代表性的特征。通过组合、转换、或者聚合现有的特征形成能够更好反映数据规律的特征。 交互特征 将两个特征组合起来形成新的特征。例如两个特征的乘积、和或差等。 例如将年龄与收入结合创建新的特征可能能更好地反映某些模式。 统计特征 从原始特征中提取统计值例如求某个时间窗口的平均值、最大值、最小值、标准差等。 例如在时间序列数据中你可以从原始数据中提取每个小时、每日的平均值。 日期和时间特征 从日期时间数据中提取如星期几、月份、年份、季度等特征。 例如将“2000-01-01”转换为“星期几”、“是否节假日”、“月初或月末”等特征。 特征降维 当数据集的特征数量非常大时特征降维可以帮助减少计算复杂度并避免过拟合。通过降维方法可以在保持数据本质的情况下减少特征的数量。 主成分分析PCA 通过线性变换将原始特征映射到一个新的空间使得新的特征主成分尽可能地保留数据的方差。 线性判别分析LDA 一种监督学习的降维方法通过最大化类间距离与类内距离的比率来降维。 t-SNEt-Distributed Stochastic Neighbor Embeddingt分布随机近邻嵌入 一种非线性的降维技术特别适合可视化高维数据。 自编码器Auto Encoder 一种神经网络模型通过压缩编码器来实现数据的降维。 常用方法 对于一个模型来说有些特征可能很关键而有些特征可能用处不大。 例如 某个特征取值较接近变化很小可能与结果无关。 某几个特征相关性较高可能包含冗余信息。 因此特征选择 在特征工程中是最基本、也最常见的操作。 另外在训练模型时有时也会遇到维度灾难即特征数量过多。我们希望能在确保不丢失重要特征的前提下减少维度的数量来降低训练模型的难度。所以在特征工程中也经常会用到 特征降维 方法。 低方差过滤法 对于特征的选择可以直接基于方差来判断这是最简单的。低方差的特征意味着该特征的所有样本值几乎相同对预测影响极小可以将其去掉。 from sklearn.feature_selection import VarianceThreshold 低方差过滤删除方差低于 0.01 的特征 var_thresh VarianceThreshold(threshold0.01) X_filtered var_thresh.fit_transform(X) 相关系数法 通过计算特征与目标变量或特征之间的相关性筛选出高相关性特征与目标相关或剔除冗余特征特征间高度相关。 皮尔逊相关系数 皮尔逊相关系数Pearson Correlation用于衡量两个变量的线性相关性取值范围[-1,1]。 r(∑_(i1)^n▒(x_i-x ̅ )(y_i-y ̅ ) )/(√(∑_(i1)^n▒(x_i-x ̅ )^2 ) √(∑_(i1)^n▒(y_i-y ̅ )^2 )) 正相关值接近1说明特征随目标变量增加而增加。 负相关值接近-1说明特征随目标变量增加而减少。 无关值接近0说明特征和目标变量无明显关系。 例如现有一数据集包括不同渠道广告投放金额与销售额。 使用pandas.DataFrame.corrwith(method“pearson”)计算各个特征与标签间的皮尔逊相关系数。 import pandas as pd advertising pd.read_csv(“data/advertising.csv”) advertising.drop(advertising.columns[0], axis1, inplaceTrue) advertising.dropna(inplaceTrue) X advertising.drop(“Sales”, axis1) y advertising[“Sales”] 计算皮尔逊相关系数 print(X.corrwith(y, method“pearson”)) TV 0.782224 Radio 0.576223 Newspaper 0.228299 dtype: float64 使用pandas.DataFrame.corr(method“pearson”)计算皮尔逊相关系数矩阵。 import seaborn as sns import matplotlib.pyplot as plt 计算皮尔逊相关系数矩阵 corr_matrix advertising.corr(method“pearson”) 可视化热力图 sns.heatmap(corr_matrix, annotTrue, cmap“coolwarm”, fmt“.2f”) plt.title(“Feature Correlation Matrix”) plt.show() 斯皮尔曼相关系数 斯皮尔曼相关系数Spearman’s Rank Correlation Coefficient的定义是等级变量之间的皮尔逊相关系数。用于衡量两个变量之间的单调关系即当一个变量增加时另一个变量是否总是增加或减少不要求是线性关系。适用于非线性关系或数据不符合正态分布的情况。 r_s1-(6∑d_i2)/(n(n2-1)) 其中 d_i是两个变量的等级之差 n是样本数 斯皮尔曼相关系数的取值范围为[-1,1] ρ1完全正相关一个变量增加另一个变量也总是增加。 ρ-1完全负相关一个变量增加另一个变量总是减少。 ρ0无相关性。 例如现有一组每周学习时长与数学考试成绩的数据 ■(Xy5558651070127515853507609721480658) 按数值由小到大排出X、y的等级并计算等级差 ■(XR_XyR_ydR_X-R_yd^252552008565500107706111287580015108510003150100746040096727-11149809006358300) ρ1-(6∑d_i2)/n(n2-1) 1-(6×2)/10(10^2-1) 1-0.01210.9879 使用pandas.DataFrame.corrwith(method“spearman”)计算斯皮尔曼相关系数。 import pandas as pd 每周学习时长 X [[5], [8], [10], [12], [15], [3], [7], [9], [14], [6]] 数学考试成绩 y [55, 65, 70, 75, 85, 50, 60, 72, 80, 58] 计算斯皮尔曼相关系数 X pd.DataFrame(X) y pd.Series(y) print(X.corrwith(y, method“spearman”)) 0.987879 主成分分析PCA 主成分分析Principal Component AnalysisPCA是一种常用的降维技术通过线性变换将高维数据投影到低维空间同时保留数据的主要变化模式。 使用sklearn.decomposition.PCA进行主成分分析。参数n_components若为小数则表示保留多少比例的信息为整数则表示保留多少个维度。 import numpy as np import matplotlib.pyplot as plt from sklearn.decomposition import PCA from sklearn.preprocessing import StandardScaler n_samples 1000 第1个主成分方向 component1 np.random.normal(0, 1, n_samples) 第2个主成分方向 component2 np.random.normal(0, 0.2, n_samples) 第3个方向噪声方差较小 noise np.random.normal(0, 0.1, n_samples) 构造3维数据 X np.vstack([component1 - component2, component1 component2, component2 noise]).T 标准化 scaler StandardScaler() X_standardized scaler.fit_transform(X) 应用PCA将3维数据降维到2维 pca PCA(n_components2) X_pca pca.fit_transform(X_standardized) 可视化 转换前的3维数据可视化 fig plt.figure(figsize(12, 4)) ax1 fig.add_subplot(121, projection“3d”) ax1.scatter(X[:, 0], X[:, 1], X[:, 2], c“g”) ax1.set_title(“Before PCA (3D)”) ax1.set_xlabel(“Feature 1”) ax1.set_ylabel(“Feature 2”) ax1.set_zlabel(“Feature 3”) 转换后的2维数据可视化 ax2 fig.add_subplot(122) ax2.scatter(X_pca[:, 0], X_pca[:, 1], c“g”) ax2.set_title(“After PCA (2D)”) ax2.set_xlabel(“Principal Component 1”) ax2.set_ylabel(“Principal Component 2”) plt.show() 模型评估和模型选择重点 损失函数 对于模型一次预测结果的好坏需要有一个度量标准。 对于监督学习而言给定一个输入X选取的模型就相当于一个“决策函数”f它可以输出一个预测结果f(X)而真实的结果标签记为Y。f(X) 和Y之间可能会有偏差我们就用一个损失函数loss function来度量预测偏差的程度记作 L(Y,f(X))。 损失函数用来衡量模型预测误差的大小损失函数值越小模型就越好 损失函数是f(X)和Y的非负实值函数 常见的损失函数有 0-1损失函数 L(Y,f(X)){█(1,Y≠f(X)0,Yf(X))┤ 平方损失函数 L(Y,f(X))〖(Y-f(X))〗^2 绝对损失函数 L(Y,f(X))|Y-f(X)| 对数似然损失函数 L(Y,P(Y|X))-logP(Y|X) 经验误差 给定一个训练数据集数据个数为n T{(x_1,y_1 ),(x_2,y_2 ),…,(x_n,y_n )} 根据选取的损失函数就可以计算出模型f(X)在训练集上的平均误差称为训练误差也被称作 经验误差empirical error 或 经验风险empirical risk。 R_emp (f)1/n ∑_(i1)^n▒〖L(y_i,f(x_i))〗 类似地在测试数据集上平均误差被称为测试误差或者 泛化误差generalization error。 一般情况下对模型评估的策略就是考察经验误差当经验风险最小时就认为取到了最优的模型。这种策略被称为 经验风险最小化empirical risk minimizationERM。 欠拟合与过拟合 拟合Fitting是指机器学习模型在训练数据上学习到规律并生成预测结果的过程。理想情况下模型能够准确地捕捉训练数据的模式并且在未见过的新数据测试数据上也有良好的表现即模型具有良好的 泛化能力。 欠拟合Underfitting是指模型在训练数据上表现不佳无法很好地捕捉数据中的规律。这样的模型不仅在训练集上表现不好在测试集上也同样表现差。 过拟合Overfitting是指模型在训练数据上表现得很好但在测试数据或新数据上表现较差的情况。过拟合的模型对训练数据中的噪声或细节过度敏感把训练样本自身的一些特点当作了所有潜在样本都会具有的一般性质从而失去了泛化能力。 产生欠拟合和过拟合的根本原因是模型的复杂度过低或过高从而导致测试误差泛化误差偏大。 欠拟合模型在训练集和测试集上误差都比较大。模型过于简单高偏差。 过拟合模型在训练集上误差较小但在测试集上误差较大。模型过于复杂高方差。 产生原因与解决办法 欠拟合 产生原因 模型复杂度不足模型过于简单无法捕捉数据中的复杂关系。 特征不足输入特征不充分或者特征选择不恰当导致模型无法充分学习数据的模式。 训练不充分训练过程中迭代次数太少模型没有足够的时间学习数据的规律。 过强的正则化正则化项设置过大强制模型过于简单导致模型无法充分拟合数据。 解决办法 增加模型复杂度选择更复杂的模型。 增加特征或改进特征工程添加更多的特征或通过特征工程来创造更有信息量的特征。 增加训练时间增加训练的迭代次数让模型有更多机会去学习。 减少正则化强度如果使用了正则化尝试减小正则化的权重以让模型更灵活。 过拟合 产生原因 模型复杂度过高模型过于复杂参数太多。 训练数据不足数据集太小模型能记住训练数据的细节但无法泛化到新数据。 特征过多特征太多模型可能会“记住”数据中的噪声而不是学到真正的规律。 训练过长训练时间过长导致模型学习到训练数据中的噪声而非数据的真正规律。 解决办法 减少模型复杂度降低模型的参数数量、使用简化的模型或降维来减小模型复杂度。 增加训练数据收集更多数据或通过数据增强来增加训练数据的多样性。 使用正则化引入L1、L2正则化避免过度拟合训练数据。 交叉验证使用交叉验证技术评估模型在不同数据集上的表现以减少过拟合的风险。 早停训练时当模型的验证损失不再下降时提前停止训练避免过度拟合训练集。 代码演示 使用多项式在x∈[-3,3]上拟合sin(x) import numpy as np import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error plt.rcParams[“font.sans-serif”] [“KaiTi”] plt.rcParams[“axes.unicode_minus”] False def polynomial(x, degree): “”“构成多项式返回 [x1,x2,x3,…,xn]”“” return np.hstack([x**i for i in range(1, degree 1)]) 生成随机数据 X np.linspace(-3, 3, 300).reshape(-1, 1) y np.sin(X) np.random.uniform(-0.5, 0.5, 300).reshape(-1, 1) fig, ax plt.subplots(1, 3, figsize(15, 4)) ax[0].plot(X, y, “yo”) ax[1].plot(X, y, “yo”) ax[2].plot(X, y, “yo”) 划分训练集和测试集 x_train, x_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42) 创建线性回归模型 model LinearRegression() 欠拟合 x_train1 x_train x_test1 x_test model.fit(x_train1, y_train) # 模型训练 y_pred1 model.predict(x_test1) # 预测 ax[0].plot(np.array([[-3], [3]]), model.predict(np.array([[-3], [3]])), “c”) # 绘制曲线 ax[0].text(-3, 1, f测试集均方误差{mean_squared_error(y_test, y_pred1):.4f}“) ax[0].text(-3, 1.3, f训练集均方误差{mean_squared_error(y_train, model.predict(x_train1)):.4f}”) 恰好拟合 x_train2 polynomial(x_train, 5) x_test2 polynomial(x_test, 5) model.fit(x_train2, y_train) # 模型训练 y_pred2 model.predict(x_test2) # 预测 ax[1].plot(X, model.predict(polynomial(X, 5)), “k”) # 绘制曲线 ax[1].text(-3, 1, f测试集均方误差{mean_squared_error(y_test, y_pred2):.4f}“) ax[1].text(-3, 1.3, f训练集均方误差{mean_squared_error(y_train, model.predict(x_train2)):.4f}”) 过拟合 x_train3 polynomial(x_train, 20) x_test3 polynomial(x_test, 20) model.fit(x_train3, y_train) # 模型训练 y_pred3 model.predict(x_test3) # 预测 ax[2].plot(X, model.predict(polynomial(X, 20)), “r”) # 绘制曲线 ax[2].text(-3, 1, f测试集均方误差{mean_squared_error(y_test, y_pred3):.4f}“) ax[2].text(-3, 1.3, f训练集均方误差{mean_squared_error(y_train, model.predict(x_train3)):.4f}”) plt.show() 当多项式次数较低时模型过于简单拟合效果较差。 当多项式次数增加后模型复杂度适中拟合效果较好训练误差和测试误差均较低。 当多项式次数继续增加模型变得过于复杂过度学习了噪声导致训练误差较低而测试误差较高。 正则化 正则化Regularization是一种在训练机器学习模型时在损失函数中添加额外项来惩罚过大的参数进而限制模型复杂度、避免过拟合提高模型泛化能力的技术。 如在平方损失函数中加入正则化项 λ∑_(i1)k▒〖ω_i〗2 Loss1/n (∑_(i1)n▒〖(f(x_i)-y_i)〗2 λ∑_(i1)k▒〖ω_i〗2 ) 原损失函数 ∑_(i1)n▒〖(f(x_i)-y_i)〗2 的目的更好的拟合数据集。 正则化项 λ∑_(i1)k▒〖〖ω_i〗2 〗的目的减小参数的大小从而降低模型的复杂度。 这里的 λ 是 正则化系数用来表示惩罚项的权重。正则化系数不属于模型的参数无法通过训练学习得到需要在模型训练开始之前手动设置这种参数被称为“超参数”。 两者相互平衡在模型的拟合能力偏差和复杂度之间找到最佳折中。 常见的正则化技术有L1正则化和L2正则化。 L1正则化Lasso回归 L1正则化在损失函数中加入参数的绝对值之和 〖Loss〗L1原Lossλ∑(i1)^k▒|ω_i | L1正则化通过惩罚模型参数的绝对值使得部分权重趋近0甚至变为0。这会导致特征选择即模型会自动“丢弃”一些不重要的特征。L1正则化有助于创建稀疏模型即许多参数为0。在解决回归问题时使用L1正则化也被称为“Lasso回归”。 λ 超参数控制着正则化的强度。较大的 λ 值意味着强烈的正则化会使模型更简单可能导致欠拟合。而较小的 λ 值则会使模型更复杂可能导致过拟合。 L2正则化Ridge回归岭回归 L2正则化在损失函数中加入参数的平方之和 〖Loss〗L2原Lossλ∑(i1)k▒〖ω_i〗2 L2正则化通过惩罚模型参数的平方使得所有参数都变得更小但不会将参数强行压缩为0。它会使得模型尽量平滑从而防止过拟合。 在解决回归问题时使用L2正则化也被称为“岭回归”。 ElasticNet正则化(弹性网络回归) ElasticNet正则化结合了L1和L2正则化通过调整两个正则化项的比例来取得平衡从而同时具备稀疏性和稳定性的优点。 〖Loss〗ElasticNet原Lossλ(α∑(i1)^n▒|ω_i | (1-α)/2 ∑_(i1)n▒〖ω_i〗2 ) α∈[0,1]决定L1和L2的权重。 正则化案例 同样以使用多项式在x∈[-3,3]上拟合sin(x)为例分别不使用正则化、使用L1正则化、使用L2正则化进行拟合。 import numpy as np import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression, Lasso, Ridge from sklearn.metrics import mean_squared_error plt.rcParams[“font.sans-serif”] [“KaiTi”] plt.rcParams[“axes.unicode_minus”] False def polynomial(x, degree): “”“构成多项式返回 [x1,x2,x3,…,xn]”“” return np.hstack([x**i for i in range(1, degree 1)]) 生成随机数据 X np.linspace(-3, 3, 300).reshape(-1, 1) y np.sin(X) np.random.uniform(-0.5, 0.5, X.size).reshape(-1, 1) fig, ax plt.subplots(2, 3, figsize(15, 8)) ax[0, 0].plot(X, y, “yo”) ax[0, 1].plot(X, y, “yo”) ax[0, 2].plot(X, y, “yo”) 划分训练集和测试集 x_train, x_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42) x_train1 polynomial(x_train, 20) x_test1 polynomial(x_test, 20) 拟合 model LinearRegression() model.fit(x_train1, y_train) # 模型训练 y_pred3 model.predict(x_test1) # 预测 ax[0, 0].plot(X, model.predict(polynomial(X, 20)), “r”) # 绘制曲线 ax[0, 0].text(-3, 1, f测试集均方误差{mean_squared_error(y_test, y_pred3):.4f}) ax[1, 0].bar(np.arange(20), model.coef_.reshape(-1)) # 绘制所有系数 L1正则化-Lasso回归 lasso Lasso(alpha0.01) lasso.fit(x_train1, y_train) # 模型训练 y_pred3 lasso.predict(x_test1) # 预测 ax[0, 1].plot(X, lasso.predict(polynomial(X, 20)), “r”) # 绘制曲线 ax[0, 1].text(-3, 1, f测试集均方误差{mean_squared_error(y_test, y_pred3):.4f}) ax[0, 1].text(-3, 1.2, “Lasso回归”) ax[1, 1].bar(np.arange(20), lasso.coef_) # 绘制所有系数 L2正则化-岭回归 ridge Ridge(alpha1) ridge.fit(x_train1, y_train) # 模型训练 y_pred3 ridge.predict(x_test1) # 预测 ax[0, 2].plot(X, ridge.predict(polynomial(X, 20)), “r”) # 绘制曲线 ax[0, 2].text(-3, 1, f测试集均方误差{mean_squared_error(y_test, y_pred3):.4f}) ax[0, 2].text(-3, 1.2, “岭回归”) ax[1, 2].bar(np.arange(20), ridge.coef_) # 绘制所有系数 plt.show() 交叉验证 交叉验证Cross-Validation是一种评估模型泛化能力的方法通过将数据集划分为多个子集反复进行训练和验证以减少因单次数据划分带来的随机性误差。通过交叉验证能更可靠地估计模型在未知数据上的表现。亦能避免因单次数据划分不合理导致的模型过拟合或欠拟合。 简单交叉验证Hold-Out Validation 将数据划分为训练集和验证集如70%训练30%验证。结果受单次划分影响较大可能高估或低估模型性能。 k折交叉验证k-Fold Cross-Validation 将数据均匀分为k个子集称为“折”每次用k−1折训练剩余1折验证重复k次后取平均性能。充分利用数据结果更稳定。 留一交叉验证Leave-One-OutLOO 每次仅留一个样本作为验证集其余全部用于训练重复直到所有样本都被验证一次。适用于小数据集计算成本极高。 模型求解算法 正则化可以有效防止过拟合增强模型的泛化能力。这时模型的评估策略就是让结构化的经验风险最小即增加了正则化项的损失函数最小称为 结构风险最小化Structural Risk MinimizationSRM。 min 1/n ∑_(i1)^n▒〖L(y_i,f(x_i))λJ(θ)〗 这其实就是求解一个 最优化问题。代入训练集所有数据 (x_i,y_i )要求最小值的目标函数就是模型中参数 θ的函数。 具体求解的算法可以利用数学公式直接计算解析解也可以使用迭代算法。 解析法 如果模型损失函数的最小值可以通过数学公式进行严格推导得到一个解析解那么就直接得到了最优模型的全部参数。这种方法称作解析法。 特点 适用条件目标函数必须可导且导数方程有解析解。 优点直接且精确计算高效 缺点适用条件较为苛刻特征维度较大时矩阵求逆计算复杂度极高。 应用示例 线性回归问题可以采用“最小二乘法”求得解析解。 〖Loss〗_MSE〖1/n (Xβ-y)〗^T (Xβ-y) ∇〖Loss〗_MSE2/n X^T (Xβ-y)0 β〖(X^T X)〗^(-1) X^T y 线性回归L2正则化Ridge回归岭回归 可以得到解析解如下 〖Loss〗_L21/n (Xβ-y)^T (Xβ-y)1/n λβ^T β ∇〖Loss〗_L22/n X^T (Xβ-y)2/n λβ0 β〖(X^T XλI)〗^(-1) X^T y 由于加入的对角矩阵 λI 就像一条“山岭”因此L2正则化也称作“岭回归”。 梯度下降法重点 梯度下降法gradient descent是一种常用的一阶优化方法是求解无约束优化问题最简单、最经典的方法之一。梯度下降法是迭代算法基本思路就是先选取一个适当的初始值θ_0然后沿着梯度方向或者负梯度方向不停地更新参数最终取到极小值。 梯度方向函数变化增长最快的方向变量沿此方向变化时函数增长最快 负梯度方向函数变化减少最快的方向变量沿此方向变化时函数减少最快因为损失函数是系数的函数那么如果系数沿着损失函数的负梯度方向变化此时损失函数减少最快能够以最快速度下降到极小值。 θ_(k1)θ_k- α·▽L(θ_k) 这里的▽L(θ_k )是参数取值为〖 θ〗_k 时损失函数 L 的梯度 α 是每次迭代的“步长”被称为“学习率”。学习率也是一个常见的超参数需要手动设置选择不当会导致收敛失败。 特点 梯度下降不一定能够找到全局的最优解有可能是一个局部最优解。 优点适用性广计算简单 缺点收敛速度慢可能陷入局部最优。 分类 批量梯度下降Batch Gradient DescentBGD 每次迭代使用全部训练数据计算梯度。 优点稳定收敛。 缺点计算开销大。 随机梯度下降Stochastic Gradient DescentSGD 每次迭代随机选取一个样本计算梯度。 优点速度快适合大规模数据。 缺点梯度更新方向不稳定优化过程震荡较大可能难以收敛。 小批量梯度下降Mini-batch Gradient DescentMBGD 每次迭代使用一小批样本如32、64个计算梯度。 平衡了BGD的稳定性和SGD的速度是最常用的方法。 梯度下降法计算步骤 初始化参数随机选择初始参数 计算梯度在当前参数下计算损失函数的梯度 更新参数沿负梯度方向调整参数 重复迭代直到满足停止条件如梯度接近零、达到最大迭代次数等 代码实现 我们以一个单变量函数为例介绍梯度下降法的代码实现。 设f(x)x^2求x为何值时f(x)2。 目标函数J(x)(f(x)-2)2(x2-2)^2原问题等价于求x为何值时目标函数取得最小值。 使用梯度下降法求解。 x初始值取1 学习率α取0.1 dJ(x)/dx2×(x2-2)×2×x4x3-8x 第1步x_11J(x_1 )1〖J(x_1 )〗^‘-4x_2x_1-α〖J(x_1 )〗^’1.4 第2步x_21.4J(x_2 )0.0016〖J(x_2 )〗^‘-0.2240x_3x_2-α〖J(x_2 )〗^’1.4224 ⋮ 第n步x_n1.414213J(x_n )2.53×10^(-12)〖J(x_n )〗8.8817×10(-15) 示例代码 def J(x): “”“目标函数”“” return (x**2 - 2) ** 2 def gradient(x): “”“梯度”“” return 4 * x**3 - 8 * x x 1 # x的初始值 alpha 0.1 # 学习率 while (j : J(x)) 1e-30: # 当目标函数的值小于10的-30次幂时停止计算 print(fx{x}\tJ{j}) grad gradient(x) # 求解梯度 x x - alpha * grad # 更新参数 应用示例 L1正则化Lasso回归 梯度下降法求解的推导过程如下 〖Loss〗L11/n (∑(i1)^n▒(f(x_i )-y_i )^2 λ∑_(j1)^k▒|ω_j | ) (∂〖Loss〗L1)/(∂ω_j )1/n (2∑(i1)^n▒〖x_ij (f(x_i )-y_i ) 〗λ∙sign(ω_j )) 其中sign(ω_j ){█(1ω_j00ω_j0-1ω_j0)┤ 参数更新ω_j←ω_j-α(2/n ∑_(i1)^n▒〖x_ij (f(x_i)-y_i)〗λ/n∙sign(ω_j)) 可见L1正则化项的梯度是一个常数 λ/n当 ω_j很小时会直接变成0导致稀疏性。 L2正则化Ridge回归岭回归 梯度下降法求解的推导过程如下 〖Loss〗L21/n (∑(i1)^n▒(f(x_i )-y_i )^2 λ∑_(j1)k▒〖ω_j〗2 ) (∂〖Loss〗L2)/(∂ω_j )1/n (2∑(i1)^n▒〖x_ij (f(x_i)-y_i)〗2λω_j ) 梯度更新ω_j←ω_j-α(2/n ∑_(i1)^n▒〖x_ij (f(x_i)-y_i)〗2λ/n ω_j ) 可见L2正则化项的梯度是 2λ/n ω_j相当于在每次更新时都对 ω_j 进行缩小但不会直接变为0。 牛顿法和拟牛顿法了解 牛顿法也是求解无约束最优化问题的常用方法核心思想是利用目标函数的二阶导数信息通过迭代逐渐逼近极值点。 θ_(k1)θ_k- H^(-1) (θ_k)·▽L(θ_k) 这里的〖 H〗^(-1) (θ_k)表示损失函数 L 黑塞矩阵的逆在点 θ_k 的取值。 优点收敛速度快精度高 缺点计算复杂可能发散。 由于牛顿法中需要计算黑塞矩阵的逆〖 H〗^(-1) (θ_k)这一步比较复杂所以可以考虑用一个n阶正定矩阵来近似代替它这种方法称为“拟牛顿法”。 牛顿法和拟牛顿法一般用于解决中小规模的凸优化问题。 模型评价指标重点 对学习的泛化性能进行评估不仅需要有效可行的实验估计方法还需要有衡量模型泛化能力的评价指标也叫做性能度量performance measure。 回归模型评价指标 模型的评价指标用于衡量模型在训练集或测试集上的性能评估结果反映了模型预测的准确性和泛化能力。 对于回归问题最常用的性能度量是“均方误差” (Mean Squared ErrorMSE)。 平均绝对误差MAE MAE1/n ∑_(i1)^n▒|f(x_i)-y_i | MAE对异常值不敏感解释直观。适用于数据包含异常值的场景。 均方误差MSE MSE1/n ∑_(i1)n▒〖(f(x_i)-y_i)〗2 MSE会放大较大误差对异常值敏感。适用于需要惩罚大误差的场景。 均方根误差RMSE RMSE√(1/n ∑_(i1)n▒〖(f(x_i)-y_i)〗2 ) 与MSE类似但量纲与目标变量一致。适用于需要直观误差量纲的场景。如果一味地试图降低RMSE可能会导致模型对异常值也拟合度也很高容易过拟合。 R²决定系数 R21-(∑_(i1)n▒(f(x_i )-y_i )^2 )/(∑_(i1)^n▒(y_i-y ̅ )^2 ) 衡量模型对目标变量的解释能力越接近1越好对异常值敏感。 分类模型评价指标 对于分类问题最常用的指标就是“准确率”Accuracy它定义为分类器对测试集正确分类的样本数与总样本数之比。此外还有一系列常用的评价指标。 混淆矩阵 混淆矩阵Confusion Matrix是用于评估分类模型性能的工具展示了模型预测结果与实际标签的对比情况。 对于二分类问题混淆矩阵是一个2×2矩阵 例如有10个样本。6个是猫4个是狗。假设以猫为正例模型预测对了5个猫2个狗。 使用sklearn.metrics.confusion_matrix查看混淆矩阵 import pandas as pd import seaborn as sns from sklearn.metrics import confusion_matrix label [“猫”, “狗”] # 标签 y_true [“猫”, “猫”, “猫”, “猫”, “猫”, “猫”, “狗”, “狗”, “狗”, “狗”] # 真实值 y_pred1 [“猫”, “猫”, “狗”, “猫”, “猫”, “猫”, “猫”, “猫”, “狗”, “狗”] # 预测值 matrix1 confusion_matrix(y_true, y_pred1, labelslabel) # 混淆矩阵 print(pd.DataFrame(matrix1, columnslabel, indexlabel)) sns.heatmap(matrix1, annotTrue, fmt‘d’, cmap‘Greens’) 准确率Accuracy 正确预测的比例。 Accuracy(TPTN)/(TPTNFPFN) 上述案例中准确率(52)/100.7。 from sklearn.metrics import accuracy_score label [“猫”, “狗”] # 标签 y_true [“猫”, “猫”, “猫”, “猫”, “猫”, “猫”, “狗”, “狗”, “狗”, “狗”] # 真实值 y_pred1 [“猫”, “猫”, “狗”, “猫”, “猫”, “猫”, “猫”, “猫”, “狗”, “狗”] # 预测值 accuracy accuracy_score(y_true, y_pred1) print(accuracy) 精确率Precision 预测为正例的样本中实际为正例的比例也叫查准率。 PrecisionTP/(TPFP) 上述案例中精确率5/(52)0.7143。 from sklearn.metrics import precision_score label [“猫”, “狗”] # 标签 y_true [“猫”, “猫”, “猫”, “猫”, “猫”, “猫”, “狗”, “狗”, “狗”, “狗”] # 真实值 y_pred1 [“猫”, “猫”, “狗”, “猫”, “猫”, “猫”, “猫”, “猫”, “狗”, “狗”] # 预测值 precision precision_score(y_true, y_pred1, pos_label“猫”) # pos_label指定正例 print(precision) 召回率Recall 实际为正类的样本中预测为正类的比例也叫查全率。 RecallTP/(TPFN) 上述案例中召回率5/(51)0.8333。 from sklearn.metrics import recall_score label [“猫”, “狗”] # 标签 y_true [“猫”, “猫”, “猫”, “猫”, “猫”, “猫”, “狗”, “狗”, “狗”, “狗”] # 真实值 y_pred1 [“猫”, “猫”, “狗”, “猫”, “猫”, “猫”, “猫”, “猫”, “狗”, “狗”] # 预测值 recall recall_score(y_true, y_pred1, pos_label“猫”) # pos_label指定正例 print(recall) F1分数F1 Score 精确率和召回率的调和平均。 F1 Score(2×Precision×Recall)/(PrecisionRecall) 上述案例中F1分数(2×5/(52)×5/(51))/(5/(52)5/(51))0.7692。 from sklearn.metrics import f1_score label [“猫”, “狗”] # 标签 y_true [“猫”, “猫”, “猫”, “猫”, “猫”, “猫”, “狗”, “狗”, “狗”, “狗”] # 真实值 y_pred1 [“猫”, “猫”, “狗”, “猫”, “猫”, “猫”, “猫”, “猫”, “狗”, “狗”] # 预测值 f1 f1_score(y_true, y_pred1, pos_label“猫”) # pos_label指定正例 print(f1) 在代码中我们可通过sklearn.metrics.classification_report生成分类任务的评估报告包括精确率、召回率、F1分数等。 from sklearn.metrics import classification_report report classification_report(y_true, y_pred, labels[], target_namesNone) y_true真实标签 y_pred预测的标签 labels可选指定需要计算的类别列表默认计算所有出现过的类别 target_names可选类别名称默认使用 labels 指定的类别号 例如 from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import classification_report 生成一个二分类数据集 X, y make_classification(n_samples1000, n_features20, n_classes2, random_state100) 划分训练集和测试集 x_train, x_test, y_train, y_test train_test_split(X, y, test_size0.3, random_state100) 训练一个逻辑回归模型 model LogisticRegression() model.fit(x_train, y_train) 预测 y_pred model.predict(x_test) 生成分类报告 report classification_report(y_test, y_pred) print(report) ROC曲线 真正例率TPR实际为正例被预测为正例的比例即召回率。 假正例率FPR实际为负例被预测为正例的比例。 阈值Threshold根据阈值将概率转换为类别标签。 TPRTP/实际正例数TP/(TPFN) FPRFP/实际负例数FP/(FPTN) ROC曲线Receiver Operating Characteristic Curve受试者工作特征是评估二分类模型性能的工具以假正例率FPR为横轴以真正例率TPR为纵轴展示不同阈值下模型的表现。绘制ROC曲线时从高到低调整阈值计算每个阈值的TPR和FPR并绘制所有阈值的点形成ROC曲线。 AUC值 AUC值代表ROC曲线下的面积用于量化模型性能。AUC值越大模型区分正负类的能力越强模型性能越好。AUC值0.5表示模型接近随机猜测AUC值1代表完美模型。 可通过sklearn.metrics.roc_auc_score计算AUC值。 from sklearn.metrics import roc_auc_score auc_score roc_auc_score(y_true, y_score) y_true: 真实标签0 或 1 y_score: 正例的概率值或置信度 例如 from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import roc_auc_score 生成一个二分类数据集 X, y make_classification(n_samples1000, n_features20, n_classes2, random_state100) 划分训练集和测试集 x_train, x_test, y_train, y_test train_test_split(X, y, test_size0.3, random_state100) 训练一个逻辑回归模型 model LogisticRegression() model.fit(x_train, y_train) 预测概率值取正类的概率 y_pred_proba model.predict_proba(x_test)[:, 1] 计算AUC auc_score roc_auc_score(y_test, y_pred_proba) print(auc_score) 案例绘制ROC曲线 假设一个二分类模型的真实标签和模型输出概率如下 ■(样本真实标签模型输出概率110.9200.4310.6410.8500.2600.7710.3800.5)□(→┴按模型输出概率排序 ) ■(样本真实标签模型输出概率110.9410.8600.7310.6800.5200.4710.3500.2) 调整阈值计算TPR和FPR 阈值0.9TPR0/40FPR0/40点坐标(0,0) 阈值0.8TPR1/40.25FPR0/40点坐标(0,0.25) 阈值0.7TPR2/40.5FPR0/40点坐标(0,0.5) 阈值0.6TPR2/40.5FPR1/40.25点坐标(0.25,0.5) 阈值0.5TPR3/40.75FPR1/40.25点坐标(0.25,0.75) 阈值0.4TPR3/40.75FPR2/40.5点坐标(0.5,0.75) 阈值0.3TPR3/40.75FPR3/40.75点坐标(0.75,0.75) 阈值0.2TPR4/41FPR3/40.75点坐标(0.75,1) 根据坐标点绘制ROC曲线 KNN算法 KNN算法介绍 K近邻算法K-Nearest NeighborsKNN是一种基本的分类与回归方法属于监督学习算法。其核心思想是通过计算给定样本与数据集中所有样本的距离找到距离最近的K个样本然后根据这K个样本的类别或值来预测当前样本的类别或值。 工作原理 计算距离计算待分类样本与训练集中每个样本的距离。 选择K个近邻根据计算的距离选择距离最近的K个样本。 投票或平均 分类任务统计K个近邻各类别的数量将待分类样本归为数量最多的类别。 回归任务取K个近邻的平均值作为预测结果。 关键参数 距离度量方法选择合适的距离度量方法常见的有欧氏距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离等。 K值K值的选择对结果影响很大。K值过小容易过拟合K值过大则可能欠拟合。 优缺点 KNN优点 简单直观易于理解和实现。 无需训练过程直接利用训练数据进行预测。 KNN缺点 计算量大尤其是训练集较大时。 对噪声数据较敏感。 API使用 分类 from sklearn.neighbors import KNeighborsClassifier knn KNeighborsClassifier(n_neighbors2) # KNN分类模型K值为2 X [[2, 1], [3, 1], [1, 4], [2, 6]] # 特征 y [0, 0, 1, 1] # 标签 knn.fit(X, y) # 模型训练 knn.predict([[4, 9]]) # 预测 回归 from sklearn.neighbors import KNeighborsRegressor knn KNeighborsRegressor(n_neighbors2) # KNN回归模型K值为2 X [[2, 1], [3, 1], [1, 4], [2, 6]] # 特征 y [0.5, 0.33, 4, 3] # 标签 knn.fit(X, y) # 模型训练 knn.predict([[4, 9]]) # 预测 常见距离度量方法了解 欧氏距离 欧几里得距离Euclidean Distance是指连接两点的线段的长度。 点x(x_1,…,x_n)和y(y_1,…,y_n)之间的欧氏距离d(x,y)√(∑_(i1)^n▒(x_i-y_i )^2 )。 曼哈顿距离 曼哈顿距离Manhattan Distance是两点在标准坐标系上的绝对轴距之和。 点x(x_1,…,x_n)和y(y_1,…,y_n)之间的曼哈顿距离d(x,y)∑_(i1)^n▒|x_i-y_i | 。 曼哈顿距离得名于纽约曼哈顿的街道布局。由于曼哈顿的街道多为规则的网格状车辆只能沿水平和垂直方向行驶无法直接斜穿。因此两点之间的实际行驶距离是沿街道行走的距离而非直线距离。 切比雪夫距离 切比雪夫距离Chebyshev Distance是两点各坐标数值差的最大值。 点x(x_1,…,x_n)和y(y_1,…,y_n)之间的切比雪夫距离d(x,y)max⁡(|x_i-y_i |)。 在国际象棋中国王可以横向、纵向或斜向移动一格。其从起点到终点的最少步数就等于两点之间的切比雪夫距离。 闵可夫斯基距离 闵可夫斯基距离Minkowski Distance是一种用于度量多维空间中两点间距离的通用方法点x(x_1,…,x_n)和y(y_1,…,y_n)之间的闵可夫斯基距离d(x,y)(∑_(i1)^n▒(|x_i-y_i |)^p )^(1/p)。p越小对多个维度的差异更敏感p越大更关注最大维度的差异。 通过调整参数p闵可夫斯基距离可以退化为以下经典距离 曼哈顿距离p1d(x,y)∑_(i1)^n▒|x_i-y_i | 。 欧氏距离p2d(x,y)√(∑_(i1)^n▒(x_i-y_i )^2 )。 切比雪夫距离p∞d(x,y)max⁡(|x_i-y_i |)。 归一化与标准化 归一化 定义 将数据按比例缩放到一个固定范围[x_min,x_max]通常是[0,1]或[-1,1]。 x’(x-x_min)/(x_max-x_min ) x’2×(x-x_min)/(x_max-x_min )-1 目的 消除量纲差异不同特征的单位或量纲可能差异巨大例如身高以米为单位体重以千克为单位归一化可消除这种差异避免模型被大范围特征主导。 加速模型收敛对于梯度下降等优化算法归一化后特征处于相近的尺度优化路径更平滑收敛速度更快。 适配特定模型需求某些模型如神经网络、K近邻、SVM对输入数据的范围敏感归一化能显著提升其性能。 场景 归一化不改变原始分布形状但对异常值比较敏感。当数据分布有明显边界如图像像素值、文本词频或模型对输入范围敏感时可以优先考虑归一化。 API使用 from sklearn.preprocessing import MinMaxScaler X [[2, 1], [3, 1], [1, 4], [2, 6]] 归一化区间设置为(-1,1) X MinMaxScaler(feature_range(-1, 1)).fit_transform(X) print(X) 标准化 定义 将数据调整为均值为0、标准差为1的标准分布。 x’(x-μ)/σ 其中μ∑_(i1)n▒x_i/n是平均值σ√(∑_(i1)n▒(x_i-μ) ^2/n)是标准差。 目的 适应数据分布将数据转换为均值为0、标准差为1的分布适合假设数据服从正态分布的模型如线性回归、逻辑回归。 稳定模型训练标准化后的数据对异常值的敏感度较低相比归一化鲁棒性更强。 统一特征尺度与归一化类似标准化也能消除量纲差异但更关注数据的统计分布而非固定范围。 场景 大多数场景下标准化更通用尤其是数据分布未知或存在轻微异常值时。 API使用 from sklearn.preprocessing import StandardScaler X [[2, 1], [3, 1], [1, 4], [2, 6]] 标准化 X StandardScaler().fit_transform(X) print(X) 案例心脏病预测 数据集说明 Heart Disease数据集https://www.kaggle.com/datasets/johnsmith88/heart-disease-dataset。 年龄连续值 性别0-女1-男 胸痛类型0-典型心绞痛1-非典型心绞痛2-非心绞痛3-无症状 静息血压连续值单位mmHg 胆固醇连续值单位mg/dl 空腹血糖1-大于120mg/dl0-小于等于120mg/dl 静息心电图结果0-正常1-ST-T异常2-可能左心室肥大 最大心率连续值 运动性心绞痛1-有0-无 运动后的ST下降连续值 峰值ST段的斜率0-向上1-水平2-向下 主血管数量0到3 地中海贫血一种先天性贫血1-正常2-固定缺陷3-可逆缺陷 是否患有心脏病标签0-否1-是 加载数据集 import pandas as pd 加载数据集 heart_disease pd.read_csv(“data/heart_disease.csv”) 处理缺失值 heart_disease.dropna() heart_disease.info() heart_disease.head() 数据集划分 from sklearn.model_selection import train_test_split 划分特征和标签 X heart_disease.drop(“是否患有心脏病”, axis1) # 特征 y heart_disease[“是否患有心脏病”] # 标签 将数据集按7:3划分为训练数据与测试数据 x_train, x_test, y_train, y_test train_test_split(X, y, test_size0.3, random_state100) 特征工程 特征转换 数据集中包含多种类型的特征 类别型特征需要特殊处理 胸痛类型4种分类名义变量 静息心电图结果3种分类名义变量 峰值ST段的斜率3种分类有序变量 地中海贫血4种分类名义变量 数值型特征可直接标准化年龄、静息血压、胆固醇、最大心率、运动后的ST下降、主血管数量 二元特征保持原样性别、空腹血糖、运动性心绞痛 对于类别型特征直接使用整数编码的类别特征会被算法视为有序数值导致错误的距离计算例如会认为 胸痛类型1 和 胸痛类型2 之间的差异比 胸痛类型1和 胸痛类型3之间差异更小而实际上它们都是类别。使用 独热编码One-Hot Encoding可将类别特征转换为二元向量消除虚假的顺序关系。 from sklearn.preprocessing import StandardScaler, OneHotEncoder from sklearn.compose import ColumnTransformer 数值型特征 numerical_features [“年龄”, “静息血压”, “胆固醇”, “最大心率”, “运动后的ST下降”, “主血管数量”] 类别型特征 categorical_features [“胸痛类型”, “静息心电图结果”, “峰值ST段的斜率”, “地中海贫血”] 二元特征 binary_features [“性别”, “空腹血糖”, “运动性心绞痛”] 创建列转换器 preprocessor ColumnTransformer( transformers[ # 对数值型特征进行标准化 (“num”, StandardScaler(), numerical_features), # 对类别型特征进行独热编码使用dropfirst避免多重共线性 (“cat”, OneHotEncoder(drop“first”), categorical_features), # 二元特征不进行处理 (“binary”, “passthrough”, binary_features), ] ) 执行特征转换 x_train preprocessor.fit_transform(x_train) # 计算训练集的统计信息并进行转换 x_test preprocessor.transform(x_test) # 使用训练集计算的信息对测试集进行转换 避免多重共线性 dropfirst是独热编码中的一个参数它的核心目的是避免多重共线性Multicollinearity。 多重共线性是指特征之间存在高度线性相关关系的现象。例如特征胸痛类型包含4个类别0、1、2、3若直接进行独热编码会生成4个新列胸痛类型_0、胸痛类型_1、胸痛类型_2、胸痛类型_3此时这4列满足 胸痛类型_0胸痛类型_1胸痛类型_2胸痛类型_31 这种完全线性相关关系会导致特征矩阵的列之间存在完美共线性。 当特征矩阵存在多重共线性时模型参数估计会变得不稳定矩阵不可逆或接近奇异导致系数估计值方差增大、模型可解释性下降、过拟合等问题。 在独热编码时设置drop“first”会删除每个类别特征的第1列从而打破完全共线性。比如特征胸痛类型会生成3列胸痛类型_1、胸痛类型_2、胸痛类型_3此时 胸痛类型_10胸痛类型_20胸痛类型_30 隐含代表 胸痛类型_01 虽然KNN不直接受多重共线性影响不像线性模型但使用dropfirst也能够减少冗余特征提升计算效率。 模型训练与评估 from sklearn.neighbors import KNeighborsClassifier 使用K近邻分类模型K3 knn KNeighborsClassifier(n_neighbors3) 模型训练 knn.fit(x_train, y_train) 模型评估计算准确率 knn.score(x_test, y_test) 模型的保存 可以使用Python的joblib库保存训练好的模型 import joblib joblib.dump(knn, “knn_heart_disease”) 加载先前保存的模型 加载模型 knn_loaded joblib.load(“knn_heart_disease”) 预测 y_pred knn_loaded.predict(x_test[10:11]) 打印真实值与预测值 print(y_test.iloc[10], y_pred) 模型评估与超参数调优 网格搜索 网格搜索Grid Search是一种系统化的超参数调优方法通过遍历预定义的超参数组合找到使模型性能最优的参数配置。通过自动化调参避免手动试错提高效率。 网格搜索通常嵌套交叉验证与交叉验证结合以提高调参的可靠性 外层循环遍历参数网格中的每个参数组合。 内层循环对每个参数组合使用交叉验证评估模型性能。 对心脏病预测模型进行超参数调优 对模型训练与评估部分进行修改使用sklearn.model_selection.GridSearchCV进行交叉验证和网格搜索 from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import GridSearchCV knn KNeighborsClassifier() 网格搜索参数K值设置为1到10 param_grid {“n_neighbors”: list(range(1, 10))} GridSearchCV(estimator模型, param_grid网格搜索参数, cvk折交叉验证) knn GridSearchCV(estimatorknn, param_gridparam_grid, cv10) 模型训练 knn.fit(x_train, y_train) print(pd.DataFrame(knn.cv_results_)) # 所有交叉验证结果 print(knn.best_estimator_) # 最佳模型 print(knn.best_score_) # 最佳得分 使用最佳模型进行评估 knn knn.best_estimator_ print(knn.score(x_test, y_test)) 线性回归 线性回归简介 什么是线性回归 线性回归Linear Regression是一种用于建模两个或多个变量之间线性关系的统计方法。它通过拟合一条直线或超平面来描述自变量输入特征与因变量输出目标之间的关联并可用于预测或分析变量间的影响关系。 假设因变量y与自变量x_1,x_2,…,x_n之间的关系可以用如下线性方程表示 yβ_0β_1 x_1β_2 x_2⋯β_n x_n β_0截距模型在自变量全为0时的基准值 β_1,β_2,…,β_n自变量的系数表示每个自变量对因变量的影响程度 通过估计这些系数使模型预测值尽可能接近真实值。 一元线性回归 仅有一个自变量yβ_0β_1 x_1。 多元线性回归 包含多个自变量yβ_0β_1 x_1β_2 x_2⋯β_n x_n。 线性回归应用场景 GDP预测用历史数据如投资、消费、出口建立回归模型预测GDP增长趋势。 广告效果评估量化不同渠道广告投入对销售额的影响优化预算分配。 药物剂量研究分析药物剂量与患者生理指标如血压、血糖之间的关系。 产品质量控制通过生产参数温度、压力、原料配比预测产品性能如强度、耐久。 政策效果评估分析最低工资政策对就业率的影响或环保法规对污染排放的抑制作用。 气候变化建模用工业排放量、森林覆盖率等变量预测全球气温变化趋势。 API使用 例如某中学教师想研究学生每周学习时间小时与数学考试成绩0-100分之间的关系并预测学生成绩。 from sklearn.linear_model import LinearRegression 自变量每周学习时长 X [[5], [8], [10], [12], [15], [3], [7], [9], [14], [6]] 因变量数学考试成绩 y [55, 65, 70, 75, 85, 50, 60, 72, 80, 58] 实例化线性回归模型 model LinearRegression() 模型训练 model.fit(X, y) 系数每周每学习1小时成绩会增加多少分 print(model.coef_) 截距 print(model.intercept_) 预测,每周学习11小时成绩可能是多少分 print(model.predict([[11]])) 线性回归求解 损失函数 模型的预测值与真实值之间存在误差。 损失函数用于衡量模型预测值与真实值之间的误差并通过最小化损失函数来优化模型参数。当损失函数最小时得到的自变量系数就是最优解。 均方误差MSE MSE1/n ∑_(i1)n▒〖(f(x_i)-y_i)〗2 n样本个数。 y_i第i个样本的真实值。 f(x_i)第i个样本的预测值。 均方误差是回归任务中最常用的损失函数。均方误差对应了欧氏距离。基于均方误差最小化来进行模型求解的方法称为“最小二乘法”。在线性回归中最小二乘法就是试图找到一条直线或超平面使所有样本到直线或超平面上的欧氏距离之和最小。 均方误差的特点 均方误差对大误差比较敏感因为平方项会放大较大的误差如误差2→4误差10→100。 均方误差是凸函数存在全局的唯一最小值平方项又使损失函数处处可导便于求解最优参数。 最小二乘法最小化MSE的解析解可通过矩阵运算直接求出如β〖(X^T X)〗^(-1) X^T y。 若误差服从正态分布则均方误差对应极大似然估计是最优的损失函数。 误差服从正态分布时均方误差与极大似然估计的关系 假设因变量y与自变量x的关系为y_iβ^T x_iϵ_iϵ_i为误差项。 当误差独立且具有相同分布并且都服从正态分布时 p(ϵ_i)1/√(2πσ^2 ) exp(-〖ϵ_i〗2/(2σ2 )) 将y_i与x_i代入 p(y_i |x_i;β)1/√(2πσ^2 ) exp(-(y_i-β^T x_i )2/(2σ2 )) 似然函数 L(β)∏_(i1)^n▒〖p(y_i |x_i;β)〗∏_(i1)n▒〖1/√(2πσ2 ) exp(-(y_i-β^T x_i )2/(2σ2 ))〗 对数似然函数 ln⁡L(β)ln∏_(i1)n▒〖1/√(2πσ2 ) exp⁡(-(y_i-β^T x_i )2/(2σ2 )) 〗 -nln√2π σ-1/(2σ^2 ) ∑_(i1)n▒(y_i-βT x_i )^2 为使似然函数最大需求解1/(2σ^2 ) ∑_(i1)n▒(y_i-βT x_i )^2 1/(2σ^2 ) ∑_(i1)n▒(y_i-f(x_i))2 的最小值发现其与均方误差直接相关。即最大化对数似然函数等价于最小化均方误差。 平均绝对误差MAE MAE1/n ∑_(i1)^n▒|f(x_i)-y_i | 平均绝对误差受异常值影响较小但对小误差的惩罚较弱。适用与数据中存在显著异常值如金融风险预测的场景。 一元线性回归解析解 对于一元线性回归有 f(x_i )β_0β_1 x_i MSE1/n ∑_(i1)^n▒〖(β_0β_1 x_i-y_i)〗^2 对β_0求偏导 ∂MSE/(∂β_0 )(∂ 1/n ∑_(i1)^n▒(β_0β_1 x_i-y_i )^2 )/(∂β_0 ) 2/n ∑_(i1)^n▒〖(β_0β_1 x_i-y_i)〗 令偏导等于0 2/n ∑_(i1)^n▒(β_0β_1 x_i-y_i ) 0 β_01/n ∑_(i1)^n▒(y_i-β_1 x_i ) y ̅-β_1 x ̅ 对β_1求偏导 ∂MSE/(∂β_1 )(∂ 1/n ∑_(i1)^n▒(β_0β_1 x_i-y_i )^2 )/(∂β_1 ) 2/n ∑_(i1)^n▒〖(β_0β_1 x_i-y_i)x_i 〗 将β_0y ̅-β_1 x ̅代入 ∂MSE/(∂β_1 )2/n ∑_(i1)^n▒(x_i (y ̅-β_1 x ̅ )β_1 x_i^2-y_i x_i ) 2/n ∑_(i1)^n▒〖(β_1 (x_i^2-x_i x ̅ )x_i (y ̅-y_i ))〗 令偏导等于0 2/n ∑_(i1)^n▒(β_1 (x_i^2-x_i x ̅ )x_i (y ̅-y_i )) 0 β_1 ∑_(i1)n▒(x_i2-x_i x ̅ ) ∑_(i1)^n▒〖x_i (y_i-y ̅ ) 〗 解得 β_1(∑_(i1)^n▒〖x_i (y_i-y ̅ ) 〗)/(∑_(i1)n▒(x_i2-x_i x ̅ ) ) (∑_(i1)^n▒〖x_i (y_i-y ̅ ) 〗)/(∑_(i1)^n▒〖x_i (x_i-x ̅ ) 〗) (∑_(i1)^n▒(x_i-x ̅x ̅ )(y_i-y ̅ ) )/(∑_(i1)^n▒(x_i-x ̅x ̅ )(x_i-x ̅ ) ) (∑_(i1)^n▒(x_i-x ̅ )(y_i-y ̅ ) x ̅∑_(i1)^n▒(y_i-y ̅ ) )/(∑_(i1)^n▒(x_i-x ̅ )(x_i-x ̅ ) x ̅∑_(i1)^n▒(x_i-x ̅ ) ) 其中∑_(i1)^n▒(y_i-y ̅ ) ∑_(i1)^n▒〖y_i-ny ̅ 〗0∑_(i1)^n▒(x_i-x ̅ ) ∑_(i1)^n▒〖x_i-nx ̅ 〗0 所以 β_1(∑_(i1)^n▒(x_i-x ̅ )(y_i-y ̅ ) )/(∑_(i1)^n▒(x_i-x ̅ )^2 ) 以前述学生每周学习时间小时与数学考试成绩0-100分之间的关系为例 自变量每周学习时长 X [[5], [8], [10], [12], [15], [3], [7], [9], [14], [6]] 因变量数学考试成绩 y [55, 65, 70, 75, 85, 50, 60, 72, 80, 58] β_1(∑_(i1)^n▒(x_i-x ̅ )(y_i-y ̅ ) )/(∑_(i1)^n▒(x_i-x ̅ )^2 ) ((5-8.9)×(55-67)(8-8.9)×(65-67)⋯(6-8.9)×(58-67))/((5-8.9)2(8-8.9)2⋯(6-8.9)^2 ) 2.8707 β_0y ̅-β_1 x ̅67-2.8707×8.941.4507 解得β■(41.45072.8707) 正规方程法解析法 正规方程法介绍 正规方程法Normal Equation是一种用于求解线性回归的解析解的方法。它基于最小二乘法通过求解矩阵方程来直接获得参数值。 将损失函数转换为矩阵形式 MSE1/n ∑_(i1)^n▒(f(x_i )-y_i )^2 1/n ∑_(i1)^n▒((β_0β_1 x_i1β_2 x_i2⋯β_m x_im )-y_i )^2 1/n ∑_(i1)n▒(βT x_i-y_i )^2 1/n ‖Xβ-y‖_2^2 〖1/n (Xβ-y)〗^T (Xβ-y) Xn×(m1)的矩阵包含一个全1的列 X■(1x_11x_12⋯x_1m1x_21x_22⋯x_2m⋮⋮⋮⋱⋮1x_n1x_n2⋯x_nm ) β(m1)×1的参数向量包含截距项β_0 β■(β_0β_1⋮β_m ) yn×1的因变量向量 对β求偏导 ∂MSE/∂β∂(1/n (Xβ-y)^T (Xβ-y))/∂β 2/n X^T (Xβ-y) 当X^T X为满秩矩阵或正定矩阵时令偏导等于0 2/n X^T Xβ-〖2/n X〗^T y0 X^T XβX^T y β〖(X^T X)^(-1) X〗^T y 正规方程法适用于特征数量较少的情况。当特征数量较大时计算逆矩阵的复杂度会显著增加此时梯度下降法更为适用。 API使用 fit_intercept: 是否计算偏置 model sklearn.linear_model.LinearRegression(fit_interceptTrue) model.fit([[0, 3], [1, 2], [2, 1]], [0, 1, 2]) coef_: 系数 print(model.coef_) intercept_: 偏置 print(model.intercept_) 梯度下降法 更新公式 梯度下降法Gradient Descent是一种用于最小化目标函数的迭代优化算法。核心是沿着目标函数如损失函数的负梯度方向逐步调整参数从而逼近函数的最小值。梯度方向指示了函数增长最快的方向因此负梯度方向是函数下降最快的方向。 假设目标函数为 J(β)其中β是模型参数。梯度下降的更新公式为 β_(t1)β_t-α⋅∇J(β_t) α学习率Learning Rate用于控制步长 ∇J(β_t)目标函数在β_t处的梯度偏导数组成的向量 计算示例 以前述学生每周学习时间小时与数学考试成绩0-100分之间的关系为例。 自变量学习时长x[■(58101215379146)]^T。 因变量数学考试成绩y[■(55657075855060728058)]^T 。 求β[■(β_0β_1 )]^T 使得损失函数 J(β)1/n ∑_(i1)n▒〖(f(x_i)-y_i)〗2 最小为此需要求出损失函数相对β的梯度。 x添加一列1转换为X[■(111111111158101215379146)]^T。则损失函数J(β)1/n ‖Xβ-y‖_2^2。 求得损失函数的梯度 ∇J(β)2/n X^T (Xβ-y) 使用梯度下降法求解β[■(β_0β_1 )]^T。 β初始值取[■(11)]^T 学习率α取0.01 ∇J(β)2/n X^T (Xβ-y) β_1■(11)J(β_1 )3311.3∇J(β_1 )■(-114.2-1067.6)β_2β_1-α∇J(β_1 )■(2.14211.676) β_2■(2.14211.676)J(β_2 )2589.9686∇J(β_2 )■(78.1168936.3284)β_3β_2-α∇J(β_2 )■(1.36082.3127) ⋮ β_n■(41.450693942.87070855)J(β_n )2.98115413∇J(β_n )■(-2.33768560×10(-12)1.17950094×10(-13) ) 示例代码 import numpy as np def J(beta): “”“目标函数”“” return np.sum((X beta - y) ** 2, axis0).reshape(-1, 1) / n def gradient(beta): “”“梯度”“” return X.T (X beta - y) / n * 2 X np.array([[5], [8], [10], [12], [15], [3], [7], [9], [14], [6]]) # 自变量每周学习时长 y np.array([[55], [65], [70], [75], [85], [50], [60], [72], [80], [58]]) # 因变量数学考试成绩 beta np.array([[1], [1]]) # 初始化参数 n X.shape[0] # 样本数 X np.hstack([np.ones((n, 1)), X]) # X添加一列1与偏置项相乘 alpha 1e-2 # 学习率 epoch 0 # 迭代次数 while (j : J(beta)) 1e-10 and (epoch : epoch 1) 10000: grad gradient(beta) # 求解梯度 if epoch % 1000 0: print(fbeta{beta.reshape(-1)}\tJ{j.reshape(-1)}) beta beta - alpha * grad # 更新参数 学习率的选择 学习率过大可能导致跳过最优解甚至发散。 学习率过小收敛速度慢易陷入局部极小。 自适应学习率高级优化器如Adam、Adagrad动态调整学习率以提升性能。 梯度下降法常见问题 特征缩放 通常需要提前对特征进行缩放如标准化或归一化以加快收敛速度。 局部极小值、鞍点问题 可能陷入局部极小值非全局最优解或遇到鞍点梯度为零但非极值点。 解决方案使用动量Momentum、自适应优化器如Adam或二阶方法如牛顿法。 API使用 model sklearn.linear_model.SGDRegressor( loss“squared_error”, # 损失函数默认为均方误差 fit_interceptTrue, # 是否计算偏置 learning_rate“constant”, # 学习率策略 eta00.1, # 初始学习率 max_iter1000, # 最大迭代次数 tol1e-8, # 损失值小于tol时停止迭代 ) model.fit([[0, 3], [1, 2], [2, 1]], [0, 1, 2]) coef_: 系数 print(model.coef_) intercept_: 偏置 print(model.intercept_) 案例广告投放效果预测 数据集说明 Advertising数据集https://www.kaggle.com/datasets/tawfikelmetwally/advertising-dataset。 ID序号 TV电视广告投放金额单位千元 Radio广播广告投放金额单位千元 Newspaper报纸广告投放金额单位千元 Sales销售额单位百万元 使用线性回归预测广告投放效果 import pandas as pd from sklearn.preprocessing import StandardScaler # 标准化 from sklearn.model_selection import train_test_split # 划分数据集 from sklearn.linear_model import LinearRegression, SGDRegressor # 线性回归-正规方程线性回归-随机梯度下降 from sklearn.metrics import mean_squared_error # 均方误差 加载数据集 advertising pd.read_csv(“data/advertising.csv”) advertising.drop(advertising.columns[0], axis1, inplaceTrue) advertising.dropna(inplaceTrue) advertising.info() print(advertising.head()) 划分训练集与测试集 X advertising.drop(“Sales”, axis1) y advertising[“Sales”] x_train, x_test, y_train, y_test train_test_split(X, y, test_size0.3, random_state0) 标准化 preprocessor StandardScaler() x_train preprocessor.fit_transform(x_train) # 计算训练集的均值和标准差并标准化训练集 x_test preprocessor.transform(x_test) # 使用训练集的均值和标准差对测试集标准化 使用正规方程法拟合线性回归模型 normal_equation LinearRegression() normal_equation.fit(x_train, y_train) print(“正规方程法解得模型系数:”, normal_equation.coef_) print(“正规方程法解得模型偏置:”, normal_equation.intercept_) 使用随机梯度下降法拟合线性回归模型 gradient_descent SGDRegressor() gradient_descent.fit(x_train, y_train) print(“随机梯度下降法解得模型系数:”, gradient_descent.coef_) print(“随机梯度下降法解得模型偏置:”, gradient_descent.intercept_) 使用均方误差评估模型 print(“正规方程法均方误差:”, mean_squared_error(y_test, normal_equation.predict(x_test))) print(“随机梯度下降法均方误差:”, mean_squared_error(y_test, gradient_descent.predict(x_test))) 逻辑回归 逻辑回归简介 什么是逻辑回归 逻辑回归Logistic Regression是一种用于解决分类问题的统计方法尤其适用于二分类问题。尽管名称中有“回归”但它主要用于分类任务。 逻辑回归通过将线性回归的输出映射到[0,1]区间来表示某个类别的概率。 常用的映射函数是sigmoid函数f(x)1/(1e^(-x) )其导数f’(x)f(x)(1-f(x))。 逻辑回归结果可表示为 P(y1∣x)1/(1e^(-(β_0β_1 x_1β_2 x_2⋯β_n x_n ) ) ) 其中β_0β_1 x_1β_2 x_2⋯β_n x_n为线性回归输出结果P(y1∣x)表示输出为1类的概率。根据逻辑回归结果和阈值来确认最终预测结果若逻辑回归结果大于阈值则输出为1类反之输出为0类。 ■(X[■(0.500.70.50.50.90.110.60.60.10)] )■(β[■(-120.5)] )■(线性回归输出结果[■(-0.150.952.2-0.4)] )□(→┴sigmoid ) ■(逻辑回归结果[■(0.462570150.721115180.900249510.40131234)] )→┴与阈值0.5比较 ■(预测结果[■(0110)] ) 逻辑回归应用场景 信用评分预测客户是否会违约违约/不违约。 欺诈检测预测某笔交易是否是欺诈行为。 垃圾邮件检测预测一封邮件是否是垃圾邮件垃圾邮件/非垃圾邮件。 广告点击预测预测用户是否会点击某个广告点击/不点击。 图像分类将图像分类为不同的类别如猫、狗、鸟等。 情感分析将文本分类为正面、负面或中性情感。 产品质量分类预测产品是否合格。 医学诊断预测患者是否患有某种疾病患病/未患病。 蛋白质功能预测基于蛋白质序列和结构特征预测其功能类别。 逻辑回归损失函数 逻辑回归的损失函数通常使用对数损失Log Loss也称为二元交叉熵损失Binary Cross-Entropy Loss用于衡量模型输出的概率分布与真实标签之间的差距。逻辑回归的损失函数来源于最大似然估计MLE。 P(Y│X;β)表示给定输入特征x和模型参数β时因变量y发生的概率 ├ █(P(y1│x;β)1/(1e(-(βT x) ) )P(y0│x;β)1-P(y1│x;β)1-1/(1e(-(βT x) ) ))} □(→┴整合 ) P(y│x;β) P(y│x;β)〖P(y1│x;β)〗^y (1-P(y1│x;β))^(1-y) (1/(1e(-(βT x) ) ))^y (1-1/(1e(-(βT x) ) ))^(1-y) 似然函数L(β)表示已知y的结果此时模型参数为β的概率 对于1个样本L(β)P(y│x;β)〖P(y1│x;β)〗^y (1-P(y1│x;β))^(1-y) 对于n个样本L(β)∏_(i1)^n▒〖P(y_i│x_i;β) 〗∏_(i1)n▒〖〖P(y_i1│x_i;β)〗(y_i ) (1-P(y_i1│x_i;β))^(1-y_i ) 〗 〖取对数似然log〗⁡L(β)∑_(i1)^n▒(y_i logP(y_i1│x_i;β)(1-y_i )log(1-P(y_i1│x_i;β))) 拟合的过程就是求解似然函数的最大值为了方便优化令损失函数 Loss-1/n log⁡L(β) -1/n ∑_(i1)^n▒(y_i logP(y_i1│x_i;β)(1-y_i )log(1-P(y_i1│x_i;β))) 来求解损失函数的最小值。 损失函数的梯度了解 Loss-1/n ∑_(i1)^n▒(y_i logP(y_i1│x_i;β)(1-y_i )log(1-P(y_i1│x_i;β))) -1/n (y^T logp(1-y)^T log(1-p)) 其中 y[■(y_1y_2…y_n )]^T p[■(P(y_11│x_1;β)P(y_21│x_2;β)…P(y_n1│x_n;β) )]^T [■(1/(1e(-(βT x_1 ) ) )1/(1e(-(βT x_2 ) ) )…1/(1e(-(βT x_n ) ) ))]^T 1/(1e^(-(Xβ) ) ) 则梯度 ∇Loss∂Loss/∂p∙∂p/∂β ∂(-1/n (y^T logp(1-y)^T log(1-p)))/∂p∙∂(1/(1e^(-(Xβ) ) ))/∂β -1/n (y/p-(1-y)/(1-p))∙(p⨀(1-p)∙X) 1/n X^T (p-y) 1/n X^T (1/(1e^(-(Xβ) ) )-y) 其中⨀表示Hadamard乘积逐项乘积。 API使用 LogisticRegression参数说明 scikit-learn中的LogisticRegression类用于实现逻辑回归。它支持二分类和多分类任务并提供了多种优化算法和正则化选项。 solver: 优化算法 lbfgs: 拟牛顿法默认仅支持L2正则化 newton-cg: 牛顿法仅支持L2正则化 liblinear: 坐标下降法适用于小数据集支持L1和L2正则化 sag: 随机平均梯度下降适用于大规模数据集仅支持L2正则化 saga: 改进的随机梯度下降适用于大规模数据支持L1、L2和ElasticNet正则化 penalty: 正则化类型可选l1、l2和elasticnet C: 正则化强度C越小正则化强度越大 class_weight: 类别权重balanced表示自动平衡类别权重让模型在训练时更关注少数类从而减少类别不平衡带来的偏差 model sklearn.linear_model.LogisticRegression(solver“lbfgs”, penalty“l2”, C1, class_weight“balanced”) 案例心脏病预测 Heart Disease数据集https://www.kaggle.com/datasets/johnsmith88/heart-disease-dataset。 年龄连续值 性别0-女1-男 胸痛类型1-典型心绞痛2-非典型心绞痛3-非心绞痛4-无症状 静息血压连续值单位mmHg 胆固醇连续值单位mg/dl 空腹血糖1-大于120mg/dl2-小于等于120mg/dl 静息心电图结果0-正常1-ST-T异常2-可能左心室肥大 最大心率连续值 运动性心绞痛1-有2-无 运动后的ST下降连续值 峰值ST段的斜率1-向上2-水平3-向下 主血管数量0到3 地中海贫血一种先天性贫血3-正常6-固定缺陷7-可逆缺陷 是否患有心脏病标签0-否1-是 import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler, OneHotEncoder from sklearn.compose import ColumnTransformer from sklearn.linear_model import LogisticRegression 加载数据集 heart_disease pd.read_csv(“data/heart_disease.csv”) heart_disease.dropna() 划分为训练集与测试集 X heart_disease.drop(“是否患有心脏病”, axis1) # 特征 y heart_disease[“是否患有心脏病”] # 标签 x_train, x_test, y_train, y_test train_test_split(X, y, test_size0.3, random_state100) 特征工程 数值型特征 numerical_features [“年龄”, “静息血压”, “胆固醇”, “最大心率”, “运动后的ST下降”, “主血管数量”] 类别型特征 categorical_features [“胸痛类型”, “静息心电图结果”, “峰值ST段的斜率”, “地中海贫血”] 二元特征 binary_features [“性别”, “空腹血糖”, “运动性心绞痛”] 创建列转换器 preprocessor ColumnTransformer( transformers[ # 对数值型特征进行标准化 (“num”, StandardScaler(), numerical_features), # 对类别型特征进行独热编码使用dropfirst避免多重共线性 (“cat”, OneHotEncoder(drop“first”), categorical_features), # 二元特征不进行处理 (“binary”, “passthrough”, binary_features), ] ) 执行特征转换 x_train preprocessor.fit_transform(x_train) # 计算训练集的统计信息并进行转换 x_test preprocessor.transform(x_test) # 使用训练集计算的信息对测试集进行转换 模型训练 model LogisticRegression() model.fit(x_train, y_train) 模型评估计算准确率 model.score(x_test, y_test) 多分类任务了解 逻辑回归通常用于二分类问题但可以通过一对多One-vs-RestOvR以及Softmax回归Multinomial Logistic Regression多项逻辑回归来扩展到多分类任务。 一对多OVR 实现方式 若有C个类别则训练C个二分类逻辑回归分类器。 每个分类器将一个类别作为正例、所有其他类别作为反例。 预测时计算C个分类器的输出概率选取概率最高的类别。 对于类别c P(yc│x;β)1/(1e(-(βT x) ) ) Loss-1/n ∑_(i1)^n▒(y_i logP(y_ic│x_i;β)(1-y_i )log(1-P(y_ic│x_i;β))) 优缺点 优点简单易于实现适用于类别数量较少的情况。 缺点每个类别训练1个分类器当类别数量较多时训练时间较长。 API from sklearn.linear_model import LogisticRegression model LogisticRegression(multi_class“ovr”) 或 from sklearn.multiclass import OneVsRestClassifier model OneVsRestClassifier(LogisticRegression()) Softmax回归多项逻辑回归 实现方式 直接扩展逻辑回归到多分类问题使用Softmax函数将模型输出转化为概率分布。 只需训练1个逻辑回归模型。 预测时用1个模型计算所有类别的概率选择最大值。 若有C个类别模型将输出C个分数。 对于类别cP(yc│x)e(〖β_c〗T x)/(∑_(j1)C▒e(〖β_j〗^T x) )。 损失函数Loss-1/n ∑_(i1)n▒∑_(c1)C▒〖I(y_ic)logP(y_ic│x_i ) 〗 其中I〖(y〗_ic)为示性函数当y_ic时值为1反之值为0。 优缺点 优点只训练1个模型计算高效分类一致性更好。 缺点计算Softmax需要对所有类别求指数计算量较高。 API from sklearn.linear_model import LogisticRegression model LogisticRegression(multi_class“multinomial”) 对于多分类问题LogisticRegression会自动使用multinomial因此multi_class参数可省略 model LogisticRegression() 案例手写数字识别 数据集说明 Digit Recognizer数据集https://www.kaggle.com/competitions/digit-recognizer。 文件train.csv中包含手绘数字从0到9的灰度图像每张图像为28×28像素共784像素。每个像素有一个0到255的值表示该像素的亮度。 文件第1列为标签之后784列分别为784个像素的亮度值。 第x×28y个像素表示图像第x行第y列的像素。 逻辑回归实现手写数字识别 import pandas as pd import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from sklearn.preprocessing import MinMaxScaler from sklearn.linear_model import LogisticRegression 加载数据集 digit pd.read_csv(“data/train.csv”) plt.imshow(digit.iloc[10, 1:].values.reshape(28, 28), cmap“gray”) plt.show() 划分训练集和测试集 X digit.drop(“label”, axis1) # 特征 y digit[“label”] # 标签 x_train, x_test, y_train, y_test train_test_split(X, y, test_size0.3, random_state100) 归一化 preprocessor MinMaxScaler() x_train preprocessor.fit_transform(x_train) x_test preprocessor.transform(x_test) 模型训练 model LogisticRegression(max_iter500) model.fit(x_train, y_train) 模型评估 model.score(x_test, y_test) 预测 plt.imshow(digit.iloc[123, 1:].values.reshape(28, 28), cmap“gray”) plt.show() print(model.predict(digit.iloc[123, 1:].values.reshape(1, -1))) 感知机 感知机的概念 感知机Perceptron是二分类模型接收多个信号输出一个信号。感知机的信号只有0、1两种取值。下图是一个接收两个输入信号的感知机的例子 x_1,x_2是输入信号y是输出信号w_1,w_2是权重○称为神经元或节点。输入信号被送往神经元时会分别乘以固定的权重。神经元会计算传送过来的信号的总和只有当这个总和超过某个界限值时才会输出1也称之为神经元被激活。这里将界限值称之为阈值θ。 y{■(0 (w_1 x_1w_2 x_2≤θ)1 (w_1 x_1w_2 x_2θ) )┤ 感知机的多个输入信号都有各自的权重这些权重发挥着控制各个信号的重要性的作用权重越大对应信号的重要性越高。 简单逻辑电路 与门 尝试使用感知机解决简单的问题如实现逻辑电路中的与门AND gate。与门是具有两个输入和一个输出的门电路仅在两个输入均为1时输出1其他时候输出0。这种输入信号和输出信号对应表称为真值表。 使用感知机表示与门需要确定能满足上述真值表的w_1,w_2,θ的值满足条件的参数有无数个如(w_1,w_2,θ)(0.5,0.5,0.7)或(1.0,1.0,1.0)。 与非门 再来考虑下与非门NAND gate与非门颠倒了与门的输出仅当x_1,x_2同时为1时输出0其他时候输出1。 要表示与非门满足条件的参数也有无数个如(w_1,w_2,θ)(-0.5,-0.5,-0.7)。实际上只要把实现与门的参数值的符号取反即可。 或门 再来看一下或门OR gate。或门只要有一个输入信号为1输出就为1。 (w_1,w_2,θ)(0.5,0.5,0)。 感知机的实现 简单实现 先来实现与门定义一函数AND接受x_1和x_2在函数内部初始化参数w_1,w_2,θ。当输入的加权总和超过阈值时返回1否则返回0。 def AND(x1, x2): w1, w2, theta 0.5, 0.5, 0.7 res x1 * w1 x2 * w2 if res theta: return 0 elif res theta: return 1 print(AND(0, 0)) # 0 print(AND(1, 0)) # 0 print(AND(0, 1)) # 0 print(AND(1, 1)) # 1 可以以同样的方式实现与非门和或门不过在此之前先做一些修改。 导入权重和偏置 考虑到以后的事情我们将其修改为另外一种实现形式。将θ换为-b表示感知机行为的式子变为如下形式 y{■(0 (bw_1 x_1w_2 x_2≤0)1 (bw_1 x_1w_2 x_20) )┤ b为偏置w_1,w_2为权重。下面我们使用Numpy按上述形式分别实现与门、与非门和或门。 与门 import numpy as np def AND(x1, x2): x np.array([x1, x2]) w np.array([0.5, 0.5]) b -0.7 tmp np.sum(w * x) b if tmp 0: return 0 else: return 1 print(AND(0, 0)) # 0 print(AND(1, 0)) # 0 print(AND(0, 1)) # 0 print(AND(1, 1)) # 1 偏置b与权重w_1,w_2的作用是不同的具体地说w_1,w_2是控制输入信号的重要性的参数而偏置是调整神经元被激活的容易程度的参数。 接下来实现与非门和或门 import numpy as np def NAND(x1, x2): x np.array([x1, x2]) w np.array([-0.5, -0.5]) b 0.7 tmp np.sum(w * x) b if tmp 0: return 0 else: return 1 print(NAND(0, 0)) # 1 print(NAND(1, 0)) # 1 print(NAND(0, 1)) # 1 print(NAND(1, 1)) # 0 def OR(x1, x2): x np.array([x1, x2]) w np.array([0.5, 0.5]) b -0.2 tmp np.sum(w * x) b if tmp 0: return 0 else: return 1 print(OR(0, 0)) # 0 print(OR(1, 0)) # 1 print(OR(0, 1)) # 1 print(OR(1, 1)) # 1 与门、与非门、或门是具有相同构造的感知机区别仅在于权重参数的值。因此在与非门和或门的实现中仅设置权重和偏置的值这一点和与门的实现不同。 感知机的局限 现在来考虑一下异或门XOR gate。异或门仅当x_1或x_2中的一方为1时才会输出1。 之前的感知机是无法实现这个异或门的具体原因让我们来分析一下。 感知机表示或门的式子如下 y{■(0 (-0.5x_1x_2≤0)1 (-0.5x_1x_20) )┤ 上式表示感知机会生成由直线-0.5x_1x_20划分的两个空间其中一个空间输出1另一个空间输出0如图 如果要实现异或门是无法使用一条直线将0和1分开的 但如果将直线这个限制条件去掉就可以了 感知机的局限性就在于它只能表示由一条直线划分的空间而上图中的曲线无法用感知机表示。由曲线划分的空间称为非线性空间由直线划分的空间称为线性空间。 多层感知机 我们先来考虑一下如何使用与门、与非门和或门来组合出异或门。 与门、与非门、或门用下图的符号表示 将其组合构成异或门 使用之前实现的与门、与非门和或门代码来实现异或门 import numpy as np def AND(x1, x2): x np.array([x1, x2]) w np.array([0.5, 0.5]) b -0.7 tmp np.sum(w * x) b if tmp 0: return 0 else: return 1 def NAND(x1, x2): x np.array([x1, x2]) w np.array([-0.5, -0.5]) b 0.7 tmp np.sum(w * x) b if tmp 0: return 0 else: return 1 def OR(x1, x2): x np.array([x1, x2]) w np.array([0.5, 0.5]) b -0.2 tmp np.sum(w * x) b if tmp 0: return 0 else: return 1 def XOR(x1, x2): s1 NAND(x1, x2) s2 OR(x1, x2) y AND(s1, s2) return y print(XOR(0, 0)) # 0 print(XOR(1, 0)) # 1 print(XOR(0, 1)) # 1 print(XOR(1, 1)) # 0 试着使用感知机的表示方法来表示这个异或门 如图所示这是一种多层感知机结构。 第0层的两个神经元接收输入信号并将信号发送给第1层的神经元。第1层的神经元将信号发送给第2层的神经元。第2层的神经元输出结果。 通过叠加层感知机能进行更加灵活的表示。 感知机是一种非常简单的算法也是后续学习神经网络的基础。 其他监督学习算法了解 朴素贝叶斯法 朴素贝叶斯法简介 朴素贝叶斯naive Bayes法是一种基于概率的机器学习算法。它基于贝叶斯定理并假设特征之间相互独立这就是“朴素”的来源。朴素贝叶斯法实现简单学习与预测的效率都很高是一种常用方法在许多场景下表现得非常好如文本分类垃圾邮件检测、情感分析等。 朴素贝叶斯法的核心是贝叶斯定理 P(Y|X)(P(X|Y)P(Y))/(P(X)) P(Y|X)后验概率给定特征X时类Y的概率。 P(X|Y)条件概率类Y包含特征X的概率。 P(Y)先验概率类Y的概率。 P(X)特征X的概率。 例如判断一封邮件是不是垃圾邮件Y垃圾邮件X邮件内包含“免费”这个词 P(Y|X)邮件包含“免费”时是垃圾邮件的概率。 P(X|Y)垃圾邮件中包含“免费”的概率。 P(Y)邮件是垃圾邮件的概率。 P(X)邮件包含“免费”的概率。 朴素贝叶斯假设所有特征相互独立这使得我们无需考虑特征之间复杂的依赖关系极大简化了条件概率的计算 P(X_1,X_2,…,X_n |Y)P(X_1 |Y)⋅P(X_2 |Y)⋅…⋅P(X_n |Y)∏_(j1)^n▒P(X_j |Y) 极大似然估计 在朴素贝叶斯法中学习意味着估计先验概率和条件概率。可以应用极大似然估计法估计相应的概率。 先验概率P(YC_k )Y为类C_k的极大似然估计 P(YC_k )(∑_(i1)^N▒I(y_iC_k ) )/N, k1,2,…,K 条件概率P(X_ja_jl |YC_k )Y为类C_k时第j个特征X_j为a_jl的极大似然估计 P(X_ja_jl |YC_k )(∑_(i1)^N▒I(x_jia_jl,y_iC_k ) )/(∑_(i1)^N▒I(y_iC_k ) ) j1,2,…,n; l1,2,…,L; k1,2,…,K 其中I为示性函数取值为1或0。 贝叶斯估计 使用极大似然估计可能会出现所要估计的概率值为0的情况这会影响到后验概率的计算结果使分类产生偏差。解决方法是改用贝叶斯估计。 先验概率的贝叶斯估计 P_λ (YC_k )(∑_(i1)^N▒〖I(y_iC_k )λ〗)/(NKλ), k1,2,…,K 条件概率的贝叶斯估计 P_λ (X_ja_jl |YC_k )(∑_(i1)^N▒〖I(x_jia_jl,y_iC_k )λ〗)/(∑_(i1)^N▒I(y_iC_k ) Lλ) j1,2,…,n; l1,2,…,L; k1,2,…,K 式中λ≥0当λ0时就是极大似然估计常取λ1这时称为拉普拉斯平滑。 学习与分类过程 学习时计算先验概率 P(YC_k ), k1,2,…,K 和条件概率 P(X_ja_jl |YC_k ), j1,2,…,n; l1,2,…,L; k1,2,…,K 分类时根据给定的实例x(x_1,x_2,…,x_n )计算后验概率 P(YC_k ) ∏_(j1)^n▒P(X_jx_j |YC_k ) , k1,2,…,K 并确定实例x属于哪一个类别 yargmax_(c_k ) P(YC_k ) ∏_(j1)^n▒P(X_jx_j |YC_k ) , k1,2,…,K 决策树 决策树简介 决策树Decision Tree是一种基于树形结构的算法根据一系列条件判断逐步划分数据缩小范围最终得出预测结果。决策树由4部分组成 根节点树的节点包含所有数据。 内部节点表示特征上的判断条件。 分支根据判断条件分出的路径。 叶节点最终分类或回归的结果。 决策树适用于需要规则化、可解释性和快速决策的场景尤其在数据特征明确、样本量适中的情况下表现良好。在复杂任务中它常作为基础模型与集成学习结合如随机森林、梯度提升树以提升性能。 决策树工作过程 决策树的学习通常包括3个步骤特征选择、决策树的生成和决策树的剪枝。 如果特征数量很多可以在决策树学习之前对特征进行选择只留下对训练数据有足够分类能力的特征。 学习时通常是递归地选择最优特征并根据该特征对训练数据进行划分使得对各个子数据集有一个最好的分类。首先构建根结点将所有训练数据都放在根结点。选择一个最优特征按照这一特征将训练数据集划分成子集使得各个子集有一个在当前条件下最好的分类。如果这些子集已经能够被基本正确分类那么构建叶结点并将这些子集分到所对应的叶结点中去如果还有子集不能被基本正确分类那么就对这些子集选择新的最优特征继续对其进行划分并构建相应的结点。如此递归直至所有训练数据子集被基本正确分类或者没有合适的特征为止。最后每个子集都被分到叶结点上即都有了明确的类这就生成了一棵决策树。决策树的每次划分都相当于在特征空间中引入一个超平面将当前空间一分为二。 以上方法生成的决策树可能对训练数据有很好的分类能力但对未知的测试数据却未必即可能发生过拟合现象。因此需要对已生成的树自下而上进行剪枝将树变得更简单从而使它具有更好的泛化能力。具体地就是去掉过于细分的叶结点使其回退到父结点或更高的结点然后将父结点或更高的结点改为新的叶结点。 决策树的生成只考虑局部最优决策树的剪枝则考虑全局最优。 特征选择与决策树生成 特征选择在于选取对训练数据具有分类能力的特征这样可以提高决策树学习的效率。如果利用一个特征进行分类的结果与随机分类的结果没有很大差别则称这个特征是没有分类能力的经验上扔掉这样的特征对决策树学习的精度影响不大。通常特征选择的准则是信息增益或信息增益率。 信息熵 信息熵Entropy是表示随机变量不确定性的度量设X是一个取有限个值的离散随机变量其概率分布为 P(Xx_i )p_i, i1,2,…,n 随机变量X的熵定义为 H(X)-∑_(i1)^n▒〖p_i log⁡〖p_i 〗 〗 若p_i0则定义0 log⁡00。通常式中对数以2或e为底。熵只依赖于X的分布与X的取值无关。熵越大随机变量的不确定性就越大。 设有随机变量(X,Y)其联合概率分布为 P(Xx_i,Yy_i )p_ij, i1,2,…,n; j1,2,…,m 条件熵H(Y|X)表示在已知随机变量X的条件下随机变量Y的不确定性 H(Y|X)∑_(i1)^n▒P(Xx_i )H(Y|Xx_i ) 信息增益与ID3 决策树学习应用信息增益Information Gain准则选择特征给定训练集数据D和特征A熵H(D)表示对数据集进行分类的不确定性条件熵H(D|A)表示在特征A给定条件下对数据集D进行分类的不确定性。两者之差即信息增益 g(D,A)H(D)-H(D|A) 表示由于特征A而使得对数据集D的分类的不确定性减少的程度。对数据集D而言信息增益依赖于特征不同的特征具有不同的信息增益信息增益大的特征具有更强的分类能力。在进行特征选择时对训练数据集D计算每个特征的信息增益并比较他们的大小选择信息增益最大的特征。 假设 训练数据集D有|D|个样本 特征A有n个不同的取值{a_1,a_2,…,a_n}根据特征A将D划分为n个子集D_1,D_2,…,D_nD_i的样本个数为|D_i | 有K个类C_k每个类有|C_k |个样本 子集D_i中属于类C_k的样本的集合为D_ik (D_ikD_i∩C_k)D_ik的样本个数为|D_ik |。 信息增益计算方法如下 计算数据集D的熵H(D) H(D)-∑_(k1)^K▒〖|C_k |/|D| log_2⁡〖|C_k |/|D| 〗 〗 计算特征A对数据集D的条件熵H(D|A) H(D|A)∑_(i1)^n▒|D_i |/|D| H(D_i )-∑_(i1)^n▒|D_i |/|D| ∑_(k1)^K▒〖|D_ik |/|D_i | log_2⁡〖|D_ik |/|D_i | 〗 〗 计算信息增益 g(D,A)H(D)-H(D|A) ID3算法在决策树各个节点上应用信息增益选择特征递归地构建决策树。具体方法是从根节点开始计算所有可能的信息增益选择信息增益最大的特征作为节点特征由该特征的不同取值建立子节点再依次对子节点进行上述操作直到所有特征信息增益均很小或无特征可选为止最终生成一颗决策树。 信息增益率与C4.5 使用信息增益划分训练数据集的特征会倾向于选择取值较多的特征。而使用信息增益率Information Gain Ratio可以对这一问题进行校正这是特征选择的另一个准则。 特征A对训练数据集D的信息增益率g_R (D,A)定义为信息增益gD,A与训练数据集D关于特征A的值的熵H_A (D)之比 g_R (D,A)(g(D,A))/(H_A (D) ) 其中H_A (D)-∑_(i1)^n▒〖|D_i |/|D| log_2⁡〖|D_i |/|D| 〗 〗n是特征A的取值个数。 C4.5算法与ID3算法相似但对其进行了改进使用信息增益率来选择特征。 基尼指数与CART 有K个类样本属于第k类的概率为p_k则概率分布的基尼指数 Gini§∑_(k1)^K▒〖p_k (1-p_k )1-〗 ∑_(k1)K▒p_k2 对于给定的样本集合D其基尼指数 Gini(D)1-∑_(k1)^K▒|C_k |/|D| ^2 这里C_k是D中属于第k类的样本子集K是类的个数。 如果样本集合D根据特征A是否取某一可能值a被划分为两个子集D_1,D_2则在特征A的条件下集合D的基尼指数 Gini(D,A)|D_1 |/|D| Gini(D_1 )|D_2 |/|D| Gini(D_2 ) 基尼指数Gini(D)表示集合D的不确定性基尼指数Gini(D,A)表示经Aa划分后集合D的不确定性。基尼指数越大样本集合的不确定性也越大这与信息熵相似。 CART决策树是一棵二叉树根据基尼指数生成决策树对训练数据集D的每个特征A的每一个可能的取值a计算Aa时的基尼指数选择基尼指数最小的特征及其对应的切分点作为最优特征与最优切分点并生成两个子节点将训练数据集依特征分配到两个子节点中。重复上述过程直到节点中样本数小于阈值、或样本集的基尼指数小于阈值、或没有个更多特征。 CART回归树 一颗回归树对应着输入空间特征空间的划分以及在划分上的输出值。将输入空间划分为M个单元R_1,R_2,…,R_M并且在每个单元R_m上有一个固定输出c_m的回归树模型可表示为 f(x)∑_(m1)^M▒〖c_m I(x∈R_m ) 〗 在训练数据集所在的空间中递归地将每个区域划分为两个子区域并决定每个子区域上的输出值构建二叉决策树。每次划分的目标是找到一个特征j和该特征的一个切分点s使得划分后的误差最小。在对输入空间进行划分时将特征j和它的取值s通常是连续特征取值的中间点作为切分变量和切分点定义两个区域 R_1 (j,s){x|x_j≤s} 和 R_2 (j,s){x|x_js} 然后寻找最优切分变量j和最优切分点s。具体地使用平方误差作为损失函数求解 min┬(j,s)⁡[min┬(c_1 )⁡∑_(x_i∈R_1 (j,s))▒(y_i-c_1 )^2 min┬(c_2 )⁡∑_(x_i∈R_2 (j,s))▒(y_i-c_2 )^2 ] 解出最优切分变量j和最优切分点s后使用最优切分变量j和最优切分点s后划分两个区域。重复上述过程直到满足停止条件为止。最终叶节点的输出值为该区域内所有样本目标值的均值 c ̂_mave(y_i |x_i∈R_m (j,s)) 由此生成一颗回归树这样的回归树称之为最小二乘回归树。 决策树的剪枝 决策树出现过拟合的原因在于学习时过多的考虑如何提高对训练数据的正确分类从而构建出过于复杂的决策树。为了避免过拟合可以对已生成的决策树进行剪枝从决策树上裁掉一些子树或叶节点并将其根节点或父节点作为新的叶节点从而简化模型。决策树的剪枝通常分为预剪枝Pre-Pruning和后剪枝Post-Pruning。 预剪枝是在决策树生成过程中通过设置一些限制条件提前停止树的生长避免过度分裂。常见的停止条件有限制最大树深度、限制每个节点最小样本数、限制最小的误差减少量、限制最大叶节点数量等。但过于严格的停止条件可能导致欠拟合并且可能难以确定最佳阈值需要多次尝试。 后剪枝是在决策树完全生成之后基于某种评估准则从底部向上逐步判断是否移除分支。常见的后剪枝方法有代价复杂度剪枝Cost-Complexity PruningCCP和减少误差剪枝Reduced Error PruningREP等。 代价复杂度剪枝需要首先计算子树的损失函数 C_α (T)C(T)α|T| T为任意子树|T|为子树的叶节点个数 C(T)为对训练数据的预测误差如基尼指数 α≥0为参数权衡训练数据的拟合程度和模型的复杂度。α越大越倾向于剪掉子树生成更简单的树。 C_α (T)为参数是α时子树T的整体损失 从α0开始逐渐增加α。对于每个α选择剪掉使C_α T最小的子树。生成一系列剪枝后的树使用交叉验证选择最优的α和对应的树。 减少误差剪枝则是直接基于验证集的误差来判断是否剪枝。剪枝过程遍历每个内部节点将该子树替换为一个叶节点并在验证集上比较替换前后的误差如果替换后误差没有增加则剪掉该子树。 支持向量机 支持向量机简介 支持向量机Support Vector MachinesSVM是一种二分类模型。其核心目标是寻找一个“间隔最大”的超平面将不同类别的数据点分隔开。这个超平面在二维空间中是一条直线在三维空间中是一个平面在更高维空间中则是一个超平面。 间隔最大代表该超平面与最近的数据点之间的距离最大这使得支持向量机有较强的泛化能力。 支持向量机学习方法包括由简至繁的模型线性可分支持向量机、线性支持向量机以及非线性支持向量机。 线性可分支持向量机-硬间隔 硬间隔 当训练样本线性可分时此时可以通过最大化硬间隔来学习线性可分支持向量机。硬间隔是指超平面能够将不同类的样本完全划分开。距离超平面最近的几个样本点称为支持向量它们直接决定超平面的位置和方向只要支持向量不变超平面就不会变。 在样本空间中超平面可表示为 w^T xb0 其中w(w_1,w_2,…,w_n )为法向量决定了超平面的方向b为位移项决定了超平面与原点之间的距离。将超平面记为(w,b) 相应的分类函数称为线性可分支持向量机 f(x)sign(w^T xb) 间隔与最大间隔 x’为超平面上一点w^T x^‘b0样本空间中任一点x到超平面(w,b)的距离为 r|w^T/‖w‖ x-x’||w^T xb|/‖w‖ 记每个样本点x_i的类别为y_i该样本点的函数间隔γ ̂_iy_i (w^T xb)表示分类预测的正确性及确信度若超平面(w,b)能将样本正确分类则有 {■(w^T x_ib0, y_i1w^T x_ib0, y_i-1)┤ 此时有 y_i (w^T xb)|w^T xb|0 r_i|w^T x_ib|/‖w‖ (y_i (w^T x_ib))/‖w‖ γ ̂_i/‖w‖ 我们注意到对w,b进行缩放变换w→λw,b→λb时不会改变超平面也不会改变r的值但函数间隔γ ̂_iy_i (w^T x_ib)会随着缩放w和b而发生变化。也就是说可以通过缩放w和b来任意缩放函数间隔γ ̂_i而不改变r_i。 因此令支持向量到超平面的函数间隔γ ̂_i1此时支持向量到超平面的距离r_iγ ̂_i/‖w‖ 1/‖w‖ 。两个异类支持向量到超平面的距离之和γ2/‖w‖ γ被称为“间隔”。 欲找到具有最大间隔的超平面也就是求在约束y_i (w^T x_ib)≥1下最大的γ █(max┬(w,b) 2/‖w‖ s.t. y_i (w^T x_ib)≥1) 等价于 █(min┬(w,b) ‖w‖^2/2s.t. y_i (w^T x_ib)≥1) s.t.为Subject to意为约束。 上式就是支持向量机的基本型。对上式使用拉格朗日乘子法得到其对偶问题从对偶问题中解出拉格朗日乘子进而解出w,b即可得到具有最大间隔的超平面。 线性支持向量机-软间隔 先前我们假定训练样本在样本空间中线性可分但现实中很可能并非如此此时我们无法找出一个合适的超平面将所有样本点完全正确划分。通常训练数据中会有一些特异点如果将这些特异点去掉剩下大部分样本点是线性可分的。这时我们可以放宽条件允许某些样本分错为此我们引入软间隔。 线性不可分意味着某些样本点(x_i,y_i )不能满足约束条件y_i (w^T x_ib)≥1。为解决这个问题可以对每个样本点引进一个松弛变量ξ_i≥0使得函数间隔加上松弛变量≥1。这时约束条件变为 y_i (w^T x_ib)≥1-ξ_i 同时为了在最大化间隔的时候使不满足约束的样本尽可能少目标函数中引入对误分类的惩罚 ‖w‖2/2C∑_(i1)n▒ξ_i 这里C0为惩罚系数C值越大对误分类的惩罚越大。 线性不可分的线性支持向量机的学习问题可表示如下 █(min┬(w,b,ξ) ‖w‖2/2C∑_(i1)n▒ξ_i s.t. y_i (w^T x_ib)≥1-ξ_i ) 这就是软间隔支持向量机。 非线性支持向量机-核函数 非线性分类问题是指通过利用非线性模型才能很好地进行分类的问题如下图是无法直接使用超平面对其分类的 这时我们可以通过核函数将数据从原始空间映射到高维特征空间使得数据在高维特征空间线性可分将原本的非线性问题转换为线性问题。使用核技巧学习非线性支持向量机等价于隐式地在高维特征空间中学习线性支持向量机。 ϕ(x)表示将x映射后的特征向量在特征空间中超平面可表示为 w^T ϕ(x)b0 并且有 █(min┬(w,b) ‖w‖^2/2s.t. y_i (w^T ϕ(x_i )b)≥1) 将其转化为对偶问题并求解但其对偶问题涉及到计算ϕ(x_i )^T ϕ(x_j )这是样本x_i和样本x_j映射到特征空间之后的内积。由于特征空间维度很高因此直接计算ϕ(x_i )^T ϕ(x_j )通常非常困难为了避开这一障碍设想这样一个函数 κx_i,x_j 〈ϕ(x_i ),ϕ(x_j )〉ϕ(x_i )^T ϕ(x_j ) κ就是核函数。显然若已知映射函数ϕ就可写出核函数但实际任务中我们通常不知道ϕ的形式那么如何判断给定的κ是否是核函数呢 实际上只要一个对称函数所对应的核矩阵半正定它就能作为核函数使用。这个定义在构造核函数时很有用但对于一个具体函数κ检验它是否为正定核函数并不容易因此实际中往往使用已有的核函数。 核函数的选择也是支持向量机最大的变数若核函数选择不合适意味着将样本映射到了一个不合适的特征空间很可能导致性能不佳。下面是几种常用的核函数 █(线性核 κ(x_i,x_j )x_i^T x_j多项式核 κ(x_i,x_j )(x_i^T x_j )^d高斯核 κ(x_i,x_j )exp⁡(-‖x_i-x_j ‖2/(2σ2 ))拉普拉斯核 κ(x_i,x_j )exp⁡(-‖x_i-x_j ‖/σ)Sigmoid核 κ(x_i,x_j )tanh⁡(βx_i^T x_jθ) ) 集成学习 集成学习Ensemble Learning通过某种策略组合多个个体学习器的预测结果来提高整体的预测能力。只包含同种类型的个体学习器的集成称为同质集成例如决策树集成中全是决策树同质集成中的个体学习器亦称基学习器相应的学习算法称为基学习算法。包含不同类型的个体学习器的集成称为异质集成例如同时包含决策树和神经网络。 集成学习有三大经典方法Boosting、Bagging和Stacking。 Boosting提升方法按顺序训练模型每个模型关注前一个模型的错误通过加权调整来优化整体预测。如AdaBoost通过给错分的样本更大的权重逐步改进梯度提升树用梯度下降法优化损失函数XGBoost和LightGBM是高效的梯度提升树变种。Boosting主要关注于降低偏差。 BaggingBootstrap Aggregating自助聚合从原始数据集中通过有放回的对样本采样生成多个子数据集分别训练多个独立模型最后通过投票分类或平均回归得到结果。随机森林则是在Bagging基础上随机选择特征子集训练每棵树。Bagging主要关注于降低方差。 Stacking堆叠训练多个不同类型的个体学习器之后使用一个元模型综合多个个体学习器的预测。灵活性强能结合多种模型的优势。 AdaBoost 在概率近似正确学习的框架中一个概念如果存在一个多项式的学习算法能够学习它并且正确率很高就称这个概念是强可学习的一个概念如果存在一个多项式的学习算法能够学习它但正确率仅比随机猜测略好就称这个概念是弱可学习的。后来证明强可学习与弱可学习是等价的。那么如果已经发现了弱学习算法能否通过某种方式将其提升为强学习算法 对于分类问题而言给定一个训练样本集求比较粗糙的分类规则弱分类器要比求精确的分类规则强分类器容易的多。Boosting就是从弱学习算法出发反复学习得到一系列弱分类器然后组合这些弱分类器构成一个强分类器。AdaBoost通常使用单层决策树作为基学习器单层决策树也被称为决策树桩Decision Stump。 大多数Boosting都是改变训练数据的概率分布权重分布针对不同的训练数据分布调用弱学习算法学习一系列弱分类器。AdaBoostAdaptive Boosting自适应提升的做法是提高被前一轮弱分类器错误分类的样本的权重降低被正确分类的样本的权重。这样一来后一轮弱学习器会更加关注那些没有被正确分类的数据。同时采用加权多数表决的方法加大分类误差率小的弱分类器的权重减小分类误差率大的弱分类器的权重。 AdaBoost工作流程如下 初始化训练数据权重分布通常均匀分布 D_(m1)(w_1,1,…w_(1,i),…w_(1,N) ), w_1i1/N; i1,2,…,N; m1,2,…,M 使用具有权重分布D_m的训练数据集学习得到基本分类器 G_m (x):χ→{-1,1} (G_m x将输入映射到两个值-1和1) 计算G_m (x)在训练数据集上的分类误差率 e_m∑_(i1)^N▒〖w_mi I(G_m (x_i )≠y_i ) 〗 计算弱分类器G_m (x)的权重 a_m1/2 ln⁡〖(1-e_m)/e_m 〗 更新训练数据集的权重分布 D_(m1)(w_(m1,1),…w_(m1,i),…w_(m1,N) ) 其中w_(m1,i)(w_(m,1) exp⁡(-a_m y_i G_m (x_i )))/(∑_(i1)^N▒〖w_(m,i) exp⁡(-a_m y_i G_m (x_i )) 〗), i1,2,…,N 构建基本分类器的线性组合得到最终分类器 G(x)sign(∑_(m1)^M▒〖a_m G_m (x) 〗) 随机森林 随机森林是Bagging的一个变体在以决策树为基学习器构建Bagging集成的基础上进一步在决策树训练过程中引入了随机属性选择。 具体来说传统决策树在选择划分特征时是在当前节点的特征集合假定有d个特征中选择最优特征。而在随机森林中基决策树的每个节点先从该节点的特征集合中随机选择一个包含k个特征的子集然后再从这个子集中选择一个最优特征用于划分。参数k控制着随机性的引入程度若kd则基决策树的生成与传统决策树相同若k1则随机选择一个属性用于划分。一般推荐klog_2⁡d。 随机森林简单易实现但在很多任务中都展现出了强大性能被誉为“代表集成学习技术水平的方法”。Bagging中基学习器的多样性仅来自于样本扰动而随机森林中基学习器的多样性不仅来自样本扰动还来自特征扰动这就使得最终集成的泛化性能可通过基学习器之间差异度的增加而进一步提升。 无监督学习 聚类 聚类简介 聚类Clustering旨在将数据集中的样本分成若干个簇使得同一个簇内的对象彼此相似不同簇间的对象差异较大。聚类是一种无监督学习算法不需要预先标记数据的标签完全依赖数据本身内在结构和特征来进行分组最终簇所对应的概念语义需由使用者来把握和命名。 聚类的核心是“物以类聚”具体通过以下步骤实现 定义相似性选择一个度量标准如欧氏距离余弦相似度来衡量对象之间的相似性或距离。 分组根据相似性将对象分配到不同的簇中。 优化通过迭代或直接计算调整簇的划分使簇内相似性最大化簇间差异最大化。 聚类应用场景 市场细分将消费者按购买习惯分组。 图像分割将图像像素按颜色或纹理聚类。 异常检测识别不属于任何主要簇的异常点。 生物信息对基因表达数据进行分组。 常见聚类算法 K均值聚类 K均值聚类介绍 K均值聚类K-means是基于样本集合划分的聚类方法将样本集合划分为k个子集构成k个簇将n个样本分到k个簇中每个样本到其所属簇的中心的距离最小。每个样本只能属于一个簇所以K均值聚类是硬聚类。 K均值聚类归结为样本集合的划分通过最小化损失函数来选取最优的划分C^。 首先使用欧氏距离平方作为样本之间的距离 d(x_i,x_j )‖x_i-x_j ‖^2 定义样本与其所属簇的中心之间的距离总和作为损失函数 W©∑_(l1)^k▒∑_(C(i)l)▒‖x_i-x ̅_l ‖^2 x ̅_l第l个簇的中心。 C(i)l第i个样本是否属于簇l。 K均值聚类就是求解最优化问题 C^〖arg min┬c〗⁡W©〖arg min┬c〗⁡∑_(l1)^k▒∑_(C(i)l)▒‖x_i-x ̅_l ‖^2 相似的样本被聚到同一个簇时损失函数最小。这是一个组合优化问题n个样本分到k个簇所有可能的分法数目S(n,k)1/k! ∑_(l1)k▒〖(-1)(k-1) (■(kl)) 〗 k^n这个数目是指数级的现实中采用迭代的方法求解。 K均值聚类工作流程 初始化随机选择k个样本点作为初始簇中心。 对样本进行聚类计算每个样本到各个簇中心的距离将每个样本分到与其最近的簇构成聚类结果。 计算聚类结果中每个簇中所有样本的均值作为新的簇中心。 使用新的簇中心重复上述过程直到收敛或符合停止条件例如划分不再改变。 K均值聚类特点 K均值聚类的初始中心的选择会直接影响聚类结果并且不适合非凸形状簇。 K均值聚类需要事先指定簇个数k而实际中最优的k值是不知道的需要尝试使用不同的k值检验聚类结果质量可以采用二分查找快速找到最优k值。聚类结果的质量可以用簇的平均直径来衡量一般地簇个数变小时平均直径会增加簇个数变大超过某个值后平均直径会不变而这个值正是最优的k值。 层次聚类 层次聚类Hierarchical Clustering假设簇之间存在层次结构将样本聚到层次化的簇中。层次聚类有自下而上的聚合方法和自上而下的分裂方法。因为每个样本只属于一个簇所以层次聚类属于硬聚类。 聚合聚类开始将每个样本各自分到一个簇之后将相距最近的两个簇合并如此往复直至满足停止条件例如达到预设的簇的个数、每个簇只包含一个样本、簇内样本相似性达到某个阈值等。 分裂聚类开始将整个数据集视作一个整体之后根据某种距离或相似性度量选择一个现有的簇将其分裂成两个簇使分裂后子簇内相似性高子簇间差异大如此往复直至满足停止条件。 密度聚类 密度聚类Density-Based Clustering假设聚类结构能通过样本分布的紧密程度确定。通常情况下密度聚类算法从样本密度的角度来考察样本之间的可连接性并基于可连接样本不断扩展簇以获得最终聚类效果。 DBSCAN是一种著名的密度聚类算法基于邻域参数来刻画样本分布的紧密程度。对于给定数据集D{x_1,x_2,…,x_m }定义下列概念 ε-邻域对于x_j∈D其ε-邻域包含样本集D中与x_j的距离不大于ε的样本。 核心对象若x_j的ε-邻域至少包含MinPts个对象则x_j是一个核心对象。 密度直达若x_j位于x_i的ε-邻域中且x_i是核心对象则称x_j由x_i密度直达。 密度可达对x_i和x_j若存在样本序列p_1,p_2,…,p_n其中p_1x_ip_nx_j且p_(i1)由p_i密度直达则称x_j由x_i密度可达。 密度相连对x_i和x_j存在x_k使得x_i和x_j均由x_k密度可达则称x_j由x_i密度相连。 噪声点不属于任何簇的点既不是核心对象也不在核心对象邻域内。 基于这些概念DBSCAN将簇定义为由密度可达关系导出的最大密度相连样本集合。DBSCAN先根据邻域参数ε、MinPts找出所有核心对象再以任一核心对象为出发点找出由其密度可达的样本生成一个簇直到所有核心对象均被访问过为止。 密度聚类能识别任意形状的簇可以自动识别并排除噪声点。但ε、MinPts的选择对密度聚类结果影响较大且密度聚类难以适应密度变化较大的数据集。 K-means API使用 kmeans KMeans(n_clusters3) n_clusters: 指定 K 的值 kmeans.fit(X) # 训练 kmeans.predict(X) # 预测 kmeans.fit_predict(X) # 训练并预测 示例代码 import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.datasets import make_blobs plt.rcParams[“font.sans-serif”] [“KaiTi”] plt.rcParams[“axes.unicode_minus”] False 使用 make_blobs 生成 3 个簇每个簇 100 个点 X, y_true make_blobs(n_samples300, centers3, cluster_std2) fig, ax plt.subplots(2, figsize(8, 8)) ax[0].scatter(X[:, 0], X[:, 1], s50, c“gray”, label“原始数据”) ax[0].set_title(“原始数据”) ax[0].legend() 使用 K-Means 聚类 kmeans KMeans(n_clusters3) kmeans.fit(X) y_kmeans kmeans.predict(X) # 预测每个点的簇标签 centers kmeans.cluster_centers_ # 获取簇中心 ax[1].scatter(X[:, 0], X[:, 1], s50, cy_kmeans) ax[1].scatter(centers[:, 0], centers[:, 1], s200, c“red”, marker“o”, label“簇中心”) ax[1].set_title(“K-means 聚类结果 (K3)”) ax[1].legend() plt.show() 聚类模型评估了解 由于聚类任务没有预定义的标签不像监督学习有真实类别可供比较所以需要依赖聚类结果和原始数据来衡量模型的好坏主要关注簇内的紧凑性和簇间的分离性。 轮廓系数Silhouette Coefficient 计算每个样本到同簇其他样本的平均距离内聚度a_i和到最近其他簇样本的平均距离分离度b_i综合评价聚类紧密度和分离度。 s_i(b_i-a_i)/max⁡(a_i,b_i ) ∈[-1,1] s_i的值越接近1聚类效果越好。总体轮廓系数是所有s_i的平均值。 簇内平方和Within-Cluster Sum of Squares 衡量簇内数据点到簇中心的总距离平方和常用于K-means。 WCSS∑_(k1)^K▒∑_(i∈C_k)▒‖x_i-μ_k ‖^2 其中μ_k是第k个簇的中心。 肘部法 肘部法用于确定最佳簇数K在使用K-means时非常常见它通过绘制簇数K和某个聚类质量指标通常是簇内平方和的关系曲线找到一个拐点或“肘部”即增加簇数带来的收益显著减少的点这个点通常被认为是最佳的K值。 CH指数Calinski-Harabasz Index 簇间和簇内分散度的比值也称方差比准则 CH(BCSS/(K-1))/(WCSS/(N-K)) BCSS∑_(k1)^K▒〖n_k ‖μ_k-μ‖〗^2 WCSS∑_(k1)^K▒∑_(i∈C_k)▒‖x_i-μ_k ‖^2 BCSS簇间平方和n_k是第k个簇的样本数μ_k为第k个簇的中心μ是所有样本的中心。 WCSS簇内平方和。 聚类评估API使用 import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.datasets import make_blobs from sklearn.metrics import silhouette_score, calinski_harabasz_score plt.rcParams[“font.sans-serif”] [“SimHei”] plt.rcParams[“axes.unicode_minus”] False 使用 make_blobs 生成 3 个簇每个簇 100 个点 X, y_true make_blobs(n_samples300, centers3, cluster_std5) 使用 K-Means 聚类 kmeans KMeans(n_clusters3) kmeans.fit(X) y_kmeans kmeans.predict(X) # 预测每个点的簇标签 centers kmeans.cluster_centers_ # 获取簇中心 plt.scatter(X[:, 0], X[:, 1], s50, cy_kmeans, cmap“viridis”) plt.scatter(centers[:, 0], centers[:, 1], s200, c“red”, marker“*”, label“簇中心”) plt.legend() print(“簇内平方和”, kmeans.inertia_) print(“轮廓系数”, silhouette_score(X, y_kmeans)) print(“CH指数”, calinski_harabasz_score(X, y_kmeans)) plt.show() 降维了解 奇异值分解 奇异值分解简介 奇异值分解Singular Value DecompositonSVD是一种矩阵因子分解方法用于将矩阵分解为更简单的形式从而揭示数据的内在结构和特性。通过保留最大的几个奇异值及其对应的奇异向量可以近似重构原始矩阵减少数据维度同时保留主要信息。主成分分析潜在语义分析等都用到了奇异值分解。 矩阵的奇异值分解是指将一个非零的实矩阵A∈R^(n×p)表示为三个矩阵的乘积因子分解的形式 AUΣV^T U是n阶正交矩阵UU^TI V是p阶正交矩阵VV^TI Σ是由降序排列的非负的对角元素组成的n×p矩形对角阵 Σdiag(σ_1,σ_2,…,σ_p ), σ_1≥σ_2≥⋯≥σ_p≥0, pmin⁡(n,p) UΣV^T称为矩阵A的奇异值分解σ_i称为矩阵A的奇异值U的列向量称为左奇异向量V的列向量称为右奇异向量。任一实矩阵一定存在奇异值分解且奇异值分解不唯一。 例 A[■(10000004030000002000)] 它的奇异值分解由UΣVT给出U、Σ、VT分别为 U[■(00√0.20√0.810000010000000000√0.80-√0.2)], Σ[■(4000030000√5000000000)], V^T[■(0001010010000010)] 奇异值分解算法 矩阵A的奇异值分解可以通过求对称矩阵A^T A的特征值和特征向量得到。A^T A的单位化特征向量构成正交矩阵V的列A^T A的特征值的平方根为奇异值σ_i对其由大到小排列作为对角线元素构成对角矩阵Σ求正奇异值对应的左奇异向量再求扩充的A^T的标准正交基构成正交矩阵U的列。具体过程如下 首先求A^T A的特征值和特征向量 (A^T A-λI)x0 得到特征值并将其由大到小排序 λ_1≥λ_2≥⋯≥λ_p≥0 将特征值带入方程求出对应的特征向量并将特征向量单位化得到单位特征向量构成正交矩阵V V[■(v_1v_2…v_p )] 特征值的平方根构成n×p矩形对角阵Σ Σdiag(√(λ_1 ),√(λ_2 ),…,√(λ_p )) 对A的正奇异值计算U的列向量A的秩为r u_j1/σ_j Av_j, j1,2,…,r U_1[■(u_1u_2…u_r )] 若nr则需要补充额外的正交向量使U成为n×n矩阵。求A^T的零空间的一组标准正交基{u_(r1),u_(r2),…,u_n } U_2[■(u_(r1)u_(r2)…u_n )] U[■(U_1U_2 )] 以求A[■(112200)]的奇异值分解为例 A^T A[■(120120)][■(112200)][■(5555)] (A^T A-λI)x0 得到齐次线性方程组 {■((5-λ) x_15x_205x_1(5-λ) x_20)┤ 该方程组有非零解的充要条件是 |■(5-λ555-λ)|0 λ^2-10λ0 解的λ_110,λ_20代入线性方程组得到对应的单位向量 v_1[■(1/√21/√2)], v_2[■(1/√2-1/√2)] V[■(1/√21/√21/√2-1/√2)] 奇异值σ_1√(λ_1 )√10,σ_2√(λ_2 )0构造对角矩阵 Σ[■(√1000000)] 基于A的正奇异值计算得到列向量u_1 u_11/σ_1 Av_11/√10 [■(112200)][■(1/√21/√2)][■(1/√52/√50)] 列向量u_2,u_3是AT的零空间N(AT )的一组标准正交基为此求解下面线性方程组 A^T x[■(120120)][■(x_1x_2x_3 )][■(00)] █(x_12x_20x_30x_1-2x_2 ) 分别取(x_2,x_3 )为(1,0)和(0,1)得到N(A^T )的基 [■(-210)], [■(001)] 正交基为 u_2[■(-2/√51/√50)], u_3[■(001)] 构造正交矩阵U U[■(1/√5-2/√502/√51/√50001)] 最终得到矩阵A的奇异值分解 AUΣV^T[■(1/√5-2/√502/√51/√50001)][■(√1000000)][■(1/√21/√21/√2-1/√2)] 上述过程只是为了说明计算的过程实际应用中不会使用此算法。实际应用中虽然也会求解A^T A的特征值但不直接计算A^T A。 紧凑奇异值分解与截断奇异值分解 AUΣV^T又称矩阵的完全奇异值分解实际常用的是奇异值分解的紧凑形式和截断形式。紧凑奇异值分解是与原始矩阵等秩的奇异值分解截断奇异值分解是比原始矩阵低秩的奇异值分解。 紧凑奇异值AU_r Σ_r V_rTr为矩阵A的秩。U_r∈R(n×r)取U的前r列Σ_r是r阶对角矩阵V_r∈R^(p×r)取V的前r列。 例如 A[■(10000004030000002000)], r3 U_r[■(00√0.210001000000√0.8)], Σ_r[■(40003000√5)], V_r^T[■(000101001000)] 截断奇异值A≈U_k Σ_k V_kT只取最大的k个奇异值对应的部分。U_k∈R(n×k)取U的前k列Σ_k取Σ的前k个对角线元素V_k∈R^(p×k)取V的前k列。 例如 A[■(10000004030000002000)], r2 U_2[■(0010010000)], Σ_2[■(4003)], V_2^T[■(00010100)] A_2U_2 Σ_2 V_2^T[■(00000004030000000000)] 主成分分析 主成分分析简介 主成分分析Principal Component AnalysisPCA是一种常用的无监督学习方法旨在找到数据中“最重要的方向”即方差最大的方向并用这些方向重新表达数据。 在主成分分析过程中首先将数据的每个特征规范化为平均值为0方差为1以消除不同特征之间量纲的差异再使用正交变换把线性相关的原始数据转换为线性无关的新数据主成分。主成分彼此正交并且能够最大化地保留原始数据的方差信息。主成分分析主要用于降维和发现数据的基本结构。 主成分分析可直观解释为对数据所在的原始坐标系进行旋转变换将数据投影到新坐标系的坐标轴上新坐标系的第一坐标轴、第二坐标轴等分别表示第一主成分、第二主成分等。数据在每一轴上的坐标值的平方表示相应变量的方差并且这个坐标系是所有可能的新坐标系中坐标轴上的方差的和最大的。 在数据总体上进行的主成分分析称为总体主成分分析在有限样本上进行的主成分分析称为样本主成分分析。在实际问题中通常需要在观测数据上进行主成分分析也就是样本主成分分析。 传统的主成分分析通过协方差矩阵或相关矩阵的特征值分解进行。 协方差矩阵描述变量之间的方差和协方差适用于未标准化的数据 相关矩阵描述变量之间的标准化相关性适用于标准化的数据。 特征值分解的结果给出了主成分的方向特征向量和每个主成分的方差特征值。 现在常用的方法是通过奇异值分解进行主成分分析。 相关矩阵特征值分解实现主成分分析 给定的样本数据每行为一个样本每列为一个特征对其进行规范化使其每列均值为0方差为1得到X。对于标准化后的数据其相关矩阵等于协方差矩阵。X的相关矩阵 R1/(n-1) X^T X∈R^(p×p) 求解特征方程|R-λI|0得到p个特征值λ_1,λ_2,…,λ_p降序排列作为主成分的方差。 将解得的特征值代入特征方程求出对应的单位特征向量v_1,v_2,…,v_p作为主成分方向。 根据特征值计算每个主成分的方差贡献率 方差贡献率λ_i/(∑_(i1)^p▒λ_i ), 累计方差贡献率(∑_(j1)^k▒λ_j )/(∑_(i1)^p▒λ_i ) 根据累计方差贡献率选择前k个主成分如选择累计方差贡献率大于90%的前k个主成分取V的前k列构成V_k。 将数据投影到主成分方向得到主成分YXV_k。 下面是一个主成分分析的例子 给定样本数据X。当使用样本均值替代总体均值时偏差平方和会系统性低估总体方差因此使用样本标准差√((∑_(i1)^n▒(x_i-x ̅ )^2 )/(n-1))代替总体标准差n-1提供无偏估计 X[■(23546101235711346)] □(→┴规范化 ) X[■(-0.6325-0.6751-0.58980.63250.77160.8847-1.2649-1.1574-1.1795-1.26491.25381.17950.0-0.1929-0.2949)] 计算相关矩阵对于标准化后的数据其相关矩阵等于协方差矩阵 R(X^T X)/(n-1)[■(1.00.99120.97910.99121.00.99540.97910.99541.0)] 对R进行特征值分解得到特征值和特征向量 λ_12.9772,λ_20.0021,λ_30.0002 v_1[■(-0.5760-0.5792-0.5768)],v_2[■(-0.75300.10130.6502)],v_3[■(0.3182-0.80890.4945)] 选择前两个作为主成分方向进行投影得到第一、第二主成分 █(YXV[■(-0.6325-0.6751-0.58980.63250.77160.8847-1.2649-1.1574-1.1795-1.26491.25381.17950.0-0.1929-0.2949)][■(-0.5760-0.7530-0.57920.1013-0.57680.6502)][■(1.09550.0244-1.32150.17712.07940.0683-2.1352-0.05850.2818-0.2113)] ) 奇异值分解实现主成分分析 通过奇异值分解实现主成分分析可以避免计算协方差矩阵或相关矩阵可以提高计算效率。 计算过程如下 对规范化后的样本矩阵X进行奇异值分解XUΣVTV的列向量就是X的主成分的方向主成分矩阵YXV。Σ则与协方差矩阵的特征值相关。每个主成分的方差贡献率为(σ_i2)/(∑_(i1)p▒σ_i2 )用于决定保留多少主成分。 数学验证如下 给定的样本矩阵每行为一个样本每列为一个特征对其进行规范化使其每列均值为0方差为1得到X。X的协方差矩阵为 S_X(X^T X)/(n-1) 代入奇异值分解XUΣVT因为U是正交矩阵UT UI █(S_X(X^T X)/(n-1)((UΣV^T )^T (UΣV^T ))/(n-1)(VΣ^T U^T UΣV^T)/(n-1)V (Σ^T Σ)/(n-1) VTVΛVT ) 这正是协方差矩阵的特征值分解形式其中V是特征向量λ_i(σ_i^2)/(n-1)是特征值。
http://www.zqtcl.cn/news/529411/

相关文章:

  • 留学中介网站建设方案设计企业品牌商标
  • 会展相关网站建设情况seo的基本步骤是什么
  • 太原网站建设鸣蝉公司免费网页制作网站建设
  • 中山专业网站建设网站开发基础知识简述
  • 包头索易网站建设中国建设银行网站余额查询
  • 哪家公司做网站开发做得比较好佛山商城网站制作
  • 可以做淘宝推广的网站优化网页设计是什么
  • 邢台手机网站制作优秀网站建设哪家好
  • 网站托管运营所需资料长春专用网站建设
  • 北京网站建设招聘江苏住房和城乡建设局网站
  • 如何让订阅号菜单做微网站哪家网站做的好
  • 北京建站方案北京seo主管
  • 网站平台建设费用的会计核算凡科教育小程序怎么样
  • 网站配置文件在哪里sns网站需求
  • 网站运营优化建议英国网站域名
  • 网站开发洲际企业网站模板论坛
  • 如何建外贸网站软件工程专业是干什么的
  • 衣联网和一起做网站 哪家强网站seo方案建设目标
  • 深圳企业股权优化网站程序代码优化
  • 中国石油大学网页设计与网站建设软件界面设计要求
  • 看网站有没有做404报名网站建设
  • 有哪些是做二手的网站关于网站制作的指标
  • 网站数据库是谁提供空间坐标系做图网站
  • 网站开发的外文文献佛山做网站格
  • 石家庄网站seo服务免费10大看盘软件
  • 自己做网站卖什么给个网站好人有好报2020免费
  • 网站源码安装步骤网站开发用c 语言
  • 网站首页是什么产品网络推广方案
  • 网站首页制作方案南通市规划建设局网站
  • 网站建设费用兴田德润团队西宁网站策划公司