数模算法python模板
一、规划问题
(1)线性规划
- pulp解决简单线性规划问题
1 | import pulp |
scipy求解
A,Aeq是二维数组,其他是一维数组。
1 | from scipy import optimi ze |
摘录:
二、相关性分析
其实用Excel也能做:
1 | =PEARSON(A2:A33) |
用python生成热力图:
1 | import pandas as pd |
1 | import numpy as np |
Pearson相关分析:(p∈[-1,1])
$\rho{X, Y} = \frac{\operatorname{cov}(X, Y)}{\sigma{X} \sigma{Y}} = \frac{E\left(\left(X-\mu{X}\right)\left(Y-\mu{Y}\right)\right)}{\sigma{X} \sigma{Y}} = \frac{E(X Y)-E(X) E(Y)}{\sqrt{E\left(X^{2}\right)-E^{2}(X)} \sqrt{E\left(Y^{2}\right)-E^{2}(Y)}} \\rho{X, Y} = \frac{N \sum X Y-\sum X \sum Y}{\sqrt{N \sum X^{2}-\left(\sum X\right)^{2}} \sqrt{N \sum Y^{2}-\left(\sum Y\right)^{2}}} \\rho_{X, Y} = \frac{\sum X Y-\frac{\sum X \sum Y}{N}}{\sqrt{\left(\sum X^{2}-\frac{\left(\sum X\right)^{2}}{N}\right)\left(\sum Y^{2}-\frac{\left(\sum Y\right)^{2}}{N}\right)}}$
t-检验:检验两个变量是否存在差异
如果满足两个假设:
①正态分布:
被测量的变量需要在总体和样本中呈现正态分布;
即使不满足,根据中心极限定理,若每组样本大于30时,均值分布趋近于正态分布。
②方差齐性:
需要两样本之间的方差不能差太多。
可以用T检验(t-test),计算T值,若大于临界值,则能说明有差异性。
此外,还可以考虑用 配对样本t检验(Dependent t-test for paired samples) 和 单样本t检验(One-sample t-test)。
摘录
三、数据处理和机器学习
1 | from pandas import read_csv |
数据导入#三种方式
1 | #csv特征:,分隔 文件头:字段属性 |
数据理解
1 | print(data,head(10)) |
数据可视化
1 | data.hist() #直方图 |
数据预处理:将数据转换到[0,1].
①数据缩放( MinMaxScaler )
使用算法: K近邻算法
1 | from sklearn.preprocessing import MinMaxScaler |
②正态化数据(StandardScaler)
使用算法:线性回归、逻辑回归、判别分析
1 | from sklearn.preprocessing import StandardScaler |
③标准化数据(Normalizer)常用
使用模型:神经网络、K近邻算法
1 | from sklearn.preprocessing import Normalizer |
④二值数据(Binarizer)
1 | from sklearn.preprocessing import Binarizer |
数据特征选定
①单变量特征选定(SelectKBest类)
理论:经典的卡方检验是检验定性自变量对定性自变量的相关性的方法。
多用于检验
1 | from numpy import set_printoptions |
②递归特征消除 常用
理论:用基模型筛选特征
1 | #逻辑回归为例 |
③主成分分析
理论:主成分分析(PCA) 是使用线性代数来转换压缩数据,通常被称作数据降维,常见的数据降维方法除了PCA(无监督的降维方法),还有LDA (线性判别分析,有监督的降维方法),它本身也是一个分类模型。
谨慎使用,合并后的新特征需要解释其意义。
1 | from sklearn.decomposition import PCA |
④特征重要性
理论:袋装随机树、随机森林、极端随机算法。
1 | from sklearn.ensemble import ExtraTreesClassifier |
四、模型
机器学习的解题步骤:
定义问题:类库导入、数据导入;
理解数据:描述性统计、数据可视化;
数据准备:数据清洗、特征选取、数据转换;
评估算法:分离数据、定义模型评估标准、算法审查、算法比较;
优化模型:调参、集合算法;
结果部署:验证、生成。
(1)评估算法
①分离数据集和评估数据集
1 | from sklearn.model_selection import train_test_split |
②k折交叉验证分离
为了提高模型准确率。
K折交叉验证是将原始数据分成K组(一般是均分),将每个子集数据分别做一次验证集,其余的K-1组子集数 据作为训练集,这样会得到K个模型,再用这K个模型最终的验证集的分类准确率的平均数, 作为此K折交叉验证下分类器的性能指标。K一般大于等于2,实际操作时一般从3开始取值, 只有在原始数据集和数据量小的时候才会尝试取2。K折交叉验证可以有效地避免过学习及欠学习状态的发生,最后得到的结果也比较具有说服力。通常情况下,K的取值为3、5、10.
1 | from sklearn.model_selection import KFold |
③弃一交叉验证分离.
准确率高,但计算成本高。
如果原始数据有N个样本,那么弃一交叉验证就是N-1个交叉验证,即每个样本单独作为验证 集,其余的N-1个样本作为训练集,所以弃一交叉验证会得到N个模型,用这N个模型最终的 验证集的分类准确率的平均数作为此次弃一交叉验证分类器的性能指标。
1 | from sklearn.model_selection import LeaveOneOut |
④重复随机评估、训练数据集分离。
1 | from sklearn.model_selection import ShuffleSplit |
(2)算法评估
寻找最佳的子集算法。重点工作在评估算法和准备数据上,要找到3-5种准确度足够的算法。
①分类准确度
分类准确度就是算法自动分类正确的样本数除以所有的样本数得出的结果。
1 | result = cross_val_score(model, X, Y, cv=kfold) |
②对数损失函数
分类准确度就是算法自动分类正确的样本数除以所有的样本数得出的结果。
1 | num_flods = 10 |
④AUC图
ROC和AUC是评价分类器的指标。ROC是受试者工作特征曲线(Receiver OperatingCharacteristic Curve)的简写,又称为感受性曲线(Sensitivity Curve)。得此名的原 因在于曲线上各点反映相同的感受性,它们都是对同一信号刺激的反应,只不过是在几种不 同的判定标准下所得的结果而已。ROC是反映敏感性和特异性连续变量的综合指标,用构图 法揭示敏感性和特异性的相互关系,通过将连续变量设定出多个不同的临界值计算出一系列 敏感性和特异性,再以敏感性为纵坐标、(1-特异性)为横坐标绘制成曲线。AUC是ROC曲线 下的面积(Area Under ROC Curve)的简称,顾名思义,AUC的值就是处于ROC Curve下方的 那部分面积的大小。通常,AUC的值介于0.5到1.0之间,AUC的值越大,诊断准确性越高。 在ROC曲线上,靠近坐标图左上方的点为敏感性和特异性均较高的临界值。
召回率=TP/(TP+FN),召回率(Recall)又叫敏感性(sensitivity)
特异度(Specificity) = TN/(FP+TN)
1 | from sklearn.model_selection import KFold |
⑤混淆矩阵
混淆矩阵的每一列代表了预测类别,每一列的总数表示预测为该类别的数据的数目
1 | from sklearn.metrics import confusion_matrix |
⑥结果报告
精确率(precison): P = TP / (TP + FP)
召回率(recall): P = TP / (TP + FN)
F1值:同时兼顾了分类模型的精确率和召回率, F1分数可以看作是模型准确率和召 回率的一种加权平均,它的最大值是1,最小值是0,值越大意味着模型越好。
1 | from sklearn.metrics import classification_report |
⑦绝对均值误差
1 | scoring = 'neg_mean_absolute_error' |
⑧决定系数($𝑅^2$)
决定系数($𝑅^2$) 决定系数,反映因变量的全部变异能通过回归关系被自变量解释的比例。拟合优度越大,自变 量对因变量的解释程度越高,自变量引起的变动占总变动的百分比越高,观察点在回归直线附 近越密集。如𝑅𝑅2为0.8,则表示回归关系可以解释因变量80%的变异。换句话说,如果我们能 控制自变量不变,则因变量的变异程度会减少80%。 决定系数( 𝑅𝑅2 )的特点: 可决系数是非负的统计量。 可决系数的取值范围:0≤ 𝑅𝑅2 ≤1 可决系数是样本观测值的函数,是因随机抽样而变动的随机变量。为此,对可决系数的统计的 可靠性也应进行检验。
1 | ``` |
2. 随机森林(Random Forest)
我的理解:每一棵决策树就是一个精通某一个领域的专家,这样在随机森林中就有了很多个 精通不同领域的专家,对于一个新的问题(新的输入数据),可以从不同的角度去看待它,最 终由各个专家投票得到结果。
1 | from sklearn.ensemble import RandomForestClassifier |
3. 极端随机树(Extra Trees)
随机森林应用的是Bagging模型,而极端随机树是使用所有的训练样本得到每棵决策 树,也就是每棵决策树应用的是相同的全部训练样本。
随机森林应用的是Bagging模型,而极端随机树是使用所有的训练样本得到每棵决策 树,也就是每棵决策树应用的是相同的全部训练样本。
1 | from sklearn.ensemble import ExtraTreesClassifier |
②提升(Boosting)算法
提升算法是一种用来提高弱分类(分类不明显)算法准确度的方法,这种方法先构造一个预测函数系列, 然后以一定的方式将它们组合成一个预测函数。
1.AdaBoost
一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器 (弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器).其算法本身是通过改变数据分布来实现的,它根据每次训练集中每个样本的分类是否正 确,以及上次的总体分类的准确率,来确定每个样本的权值。它将修改过权值的新数据集送给下层分类器进行训练,再将每次训练得到的分类器融合 起来,作为最后的决策分类器。使用AdaBoost分类器可以排除一些不必要的训练数据特征,并放在关键的训练数据上面。
1 | from sklearn.ensemble import AdaBoostClassifier |
2. 随机梯度提升(Stochastic Gradient Boosting)
要找到某个函数的最大值,最好的办法就是沿着该函数的梯度方向探寻。 梯度算子总是指向函数值增长最快的方向。由于梯度提升算法在每次更新数据集时都需要遍历整个数据集,计算复杂度较高,于是 有了一个改进算法一随机梯度提升算法,该算法一次只用一个样本点来更新回归系数, 极大地改善了算法的计算复杂度。
1 | from sklearn.ensemble import GradientBoostingClassifier |
③投票(Voting)算法
是一个非常简单的多个机器学习算法的集成算法。投票算法是通过创建两个或多个算法模型,利用投票算法将这些算法包装起来,计算各 个子模型的平均预测状况。在实际的应用中,可以对每个子模型的预测结果增加权重,以提高算法的准确度。
1 | from pandas import read_csv |
(5)调参
目的:提高稳定性,减小偏差和方差。
参数有两类:准确度&防止过拟合。
①网络搜索优化调参
通过遍历已定义参数的列表,来评 估算法的参数,从而找到最优参数。但是,只在自己设置的超参数里选取。一般用于参数<3。
1 | from pandas import read_csv |
②随机搜索优化调参
通过固定次数的迭代,采用随机采样分布的方式搜索合适的参数。
与网格搜索优化参数相比,随机搜索优化参数提供了一种更高效的解决方法(特别是在 参数数量多的情况下),随机搜索优化参数为每个参数定义了一个分布函数,并在该空 间中采样。
一般用于参数>3。
1 | from sklearn.linear_model import Ridge |
(6)实战
1 | #导入类库 |
参考资料:
Python数学建模与分析:基础入门、数据处理、算法编程、高级绘图、建模实战!bilibili
五、绘图
(1)箱型图
1 | data = pandas.read_excel('time.xlsx' , index_col='日期') |
1 | #删除异常值 |
(2)正太分布图
1 | import pandas as pd |
筛异常点
1 | # 计算判断异常点和极端异常点的临界值 |
六、聚类分析(无监督分析)
(1)k-means
如果K值未知,可采用肘部法选择K值(假设最大分类数为9类,分别计算分类结果为1-9类的平均离差,离差的提升变化下降最抖时的值为最优聚类数K)
//纯数组X作为输入
1 | [[1.4889993 4.18741329] |
1 | import numpy as np |
聚类有效性评价: Rand指数、轮廓系数(Silhouette Coefficient)、Calinski-Harabaz .
轮廓系数∈[-1,1],越大表示簇间相似度高而不同簇相似度低,即聚类效果越好。
1 | from sklearn.metrics import silhouette_samples |
参考:
用python实现聚类分析聚类分析python代码米法·的博客-CSDN博客
十种常用聚类算法(python完整代码演示)python 聚类小刘研CV的博客-CSDN博客
七、评价模型
(1)Topsis
1 | import numpy as np |
参考: