机器学习初级算法梳理二

  • 任务二:逻辑回归算法梳理
    • 1、逻辑回归与线性回归的联系与区别
      • 1.1 相同点
      • 1.2 不同点
    • 2、 逻辑回归的原理
    • 3、逻辑回归损失函数推导及优化
      • 3.1 推导
      • 3.2 优化
    • 4、 正则化与模型评估指标
      • 4.1 正则化
      • 4.2 LR模型评估指标
    • 5、逻辑回归的优缺点
      • 5.1 优点
      • 5.2 缺点
    • 6、样本不均衡问题解决办法
    • 7、sklearn参数

任务二:逻辑回归算法梳理

1、逻辑回归与线性回归的联系与区别

1.1 相同点

两者都是广义线性模型 GLM (Generalized linear models)

关系:可以认为逻辑回归的输入是线性回归的输出,将逻辑斯蒂函数(Sigmoid曲线)作用于线性回归的输出得到输出结果。
逻辑回归的模型 是一个非线性模型,sigmoid函数,又称逻辑回归函数。但是它本质上又是一个线性回归模型,因为除去sigmoid映射函数关系,其他的步骤,算法都是线性回归的。可以说,逻辑回归,都是以线性回归为理论支持的。
只不过,线性模型,无法做到sigmoid的非线性形式,sigmoid可以轻松处理0/1分类问题。

1.2 不同点

因变量:当响应变量本质上是分类时,使用逻辑回归。 例如,是/否,真/假,红/绿/蓝,第1 第2 /第3 /第4等。当响应变量是连续的时,使用线性回归。 例如,重量,身高,小时数等。线性回归用来预测,直接分析因变量与自变量的关系,逻辑回归用来分类,分析因变量取某个值的概率与自变量的关系。

自变量:线性回归要求自变量服从正态分布,逻辑回归对变量的分布则没有要求。 线性回归要求自变量与因变量有线性关系,Logistic回归没有要求 。

方程:线性回归给出一个方程,其形式为 Y = mX + C,而逻辑回归给出了一个 Y = eX + e-X 形式的方程。

系数解释:在线性回归中,自变量的系数解释非常简单(即保持所有其他变量不变,该变量的单位增加,预期因变量增加/减少xxx)。但是,在逻辑回归中,取决于您使用的概率分布(二项式分布,泊松分布等)是什么,自变量系数的解释是不同的。

误差最小化技术:线性回归使用普通最小二乘法来最小化误差并达到最佳拟合,线性回归模型更容易受到异常值(outlier)的影响,有可能需要不断变换阈值(threshold),是会对异常值的惩罚严重,比如使用线性回归对 {0,1} 二分类问题做预测,则一个真值为1的样本,其预测值为50,那么将会对其产生很大的惩罚,这也和实际情况不符合,更大的预测值说明为1的可能性越大,而不应该惩罚的越严重。而逻辑回归使用对数似然函数进行参数估计,使用交叉熵作为损失函数,对预测错误的惩罚是随着输出的增大,逐渐逼近一个常数,这就不存在上述问题了。
举例:
在吴恩达的课程中有一个癌症的例子,对于分类问题,若用线性回归模型来预测癌症,显然对于有异常值的情况是不适用的,对准确率有影响。但是当使用逻辑回归模型时,就明显对异常值有较好的稳定性。所以线性回归更适合用来预测数据,对于这种分类问题还是需要逻辑回归来解决。如下图:

回归情况 示例
无异常值的线性回归
有异常值的线性回归
使用逻辑回归的方法进行分类

结果:在线性回归中,结果(因变量)是连续的。 它可以具有无数个可能值中的任何一个。线性回归是拟合函数,直接使用线性回归的输出作为概率是有问题的,因为其值有可能小于0或者大于1,这是不符合实际情况的。逻辑回归是预测函数,在逻辑回归中,结果(因变量)仅具有有限数量的可能值,其输出正是[0,1]区间。见下图,

2、 逻辑回归的原理

逻辑回归(LR )的模型函数记作:y=h(x) ,具体形式如下():

对应到一元自变量的形式为:
设 z=a+bx,则:
这样的一个函数被称为逻辑函数,它在二维坐标中的表现是这样的:
因为表现为 S 形曲线,所以逻辑函数又被称为 Sigmoid 函数(S 函数)。
上图中,z是自变量(横轴),最终计算出的因变量 y(纵轴),则是一个 [0,1] 区间之内的实数值。一般而言,当 y>0.5 时,z 被归类为真(True)或阳(Positive),否则当 y<=0.5时,z 被归类为假(False)或阴性(Negative)。所以,在模型输出预测结果时,不必输出 y 的具体取值,而是根据上述判别标准,输出1(真)或0(假)。分类结果如图:


因此,LR 典型的应用是二分类问题上,也就是说,把所有的数据只分为两个类。
注意: 当然,这并不是说 LR 不能处理多分类问题,它当然可以处理。

3、逻辑回归损失函数推导及优化

3.1 推导

逻辑函数 h(x)是我们要通过训练得出来的最终结果。在最开始的时候,我们不知道其中的参数 θ 的取值,我们所有的只是若干的 x 和与其对应的 y(训练集合)。训练 LR 的过程,就是求 θ 的过程。

首先要设定一个目标:我们希望这个最终得出的 θ 达到一个什么样的效果——我们当然是希望得出来的这个 θ,能够让训练数据中被归为阳性的数据预测结果都为阳,本来被分为阴性的预测结果都为阴。

而从公式本身的角度来看,h(x) 实际上是 x 为阳性的分布概率,所以,才会在h(x)>0.5 时将 x 归于阳性。也就是说 h(x)=P(y=1)。反之,样例是阴性的概率 P(y=0)=1−h(x)。

当我们把测试数据带入其中的时候,P(y=1) 和 P(y=0) 就都有了先决条件,它们为训练数据的 x 所限定。因此:
P(y=1|x)=h(x);P(y=0|x)=1−h(x)

根据二项分布公式,可得出 P(y|x)=h(x)y(1−h(x))(1−y)

假设我们的训练集一共有 m 个数据,那么这 m 个数据的联合概率就是:

我们求取 θ 的结果,就是让这个 L(θ) 达到最大。

此处 LR 目标函数的构建过程是依据极大似然估计。L(θ) 就是 LR 的似然函数。我们要让它达到最大,也就是对其进行“极大估计”。因此,求解 LR 目标函数的过程,就是对 LR 模型函数进行极大似然估计的过程。

为了好计算,我们对它求对数。得到对数似然函数:

我们要求出让 l(θ) 能够得到最大值的 θ。

l(θ) 其实可以作为 LR 的目标函数。我们需要目标函数是一个凸函数,具备最小值。因此我们设定:J(θ)=−l(θ)。

这样,求 l(θ) 的最大值就成了求 J(θ) 的最小值。J(θ) 又叫做负对数似然函数。它就是 LR 的损失函数。

3.2 优化

我们用常见最基础的梯度下降算法来进行优化,求J(θ) 最小值,此时θ为要求的最佳参数。
基本步骤如下:
• 通过对 J(θ) 求导获得下降方向—— J′(θ);
• 根据预设的步长 α,更新参数 θ:= θ − αJ′(θ);
• 重复以上两步直到逼近最优值,满足终止条件。

下面给出计算过程:
我们已知:

J(θ) 对θ求导:

因为有:

同时,运用链式法则,有:

将上式带入上面的 J(θ) 求导式子里,有:
当 x 为多维的时候(设 x 有 n 维),则在对 z=θx 求导的时候,要对 x 的每一个维度求导。又因为 θ 和 x 维度相同,所以当 x 有 n 维的时候,θ 同样是有 n 维的。则 J(θ) 的求导也变成了对 θ 的每一个维度求导:

因此,优化算法伪代码为:

Set initial value θ0,α
while (not convergence)
{

}

4、 正则化与模型评估指标

4.1 正则化

为防止过度拟合的模型出现(过于复杂的模型),在损失函数里增加一个每个特征的惩罚因子。这个就是正则化(regularization)。

如下图(分类问题中):
第一个模型是一个线性模型,欠拟合,不能很好地适应我们的训练集;
第三个模型,过于强调拟合原始数据,而丢失了算法的本质:预测新数据。我们可以看出,若给出一个新的值使之预测,它将表现的很差,是过拟合,虽然能非常好地适应我们的训练集但在新输入变量进行预测时可能会效果不好;
显然,中间的模型似乎最合适。

问题是,如果我们发现了过拟合问题,应该如何处理?
1.丢弃一些不能帮助我们正确预测的特征。可以是手工选择保留哪些特征,或者使用一些模型选择的算法来帮忙(例如PCA)
2.正则化。 保留所有的特征,但是减少参数的大小(magnitude)。

假如我们有非常多的特征,我们并不知道其中哪些特征我们要惩罚,我们将对所有的特征进行惩罚,并且让代价函数最优化的软件来选择这些惩罚的程度。这样的结果是得到了一个较为简单的能防止过拟合问题的假设:

譬如逻辑回归的正则化

λ 就是惩罚因子。

正则化是模型处理的典型方法。也是结构风险最小的策略。在经验风险(误差平方和)的基础上,增加一个惩罚项/正则化项。

对于正则化,我们要取一个合理的 ? 的值,这样才能更好的应用正则化。

4.2 LR模型评估指标

逻辑回归----用来做分类的回归模型,其模型评价指标有:

① 混淆矩阵

混淆矩阵是监督学习中的一种可视化工具,主要用于比较分类结果和实例的真实信息。矩阵中的每一行代表实例的预测类别,每一列代表实例的真实类别。

真正(True Positive , TP):被模型预测为正的正样本。
假正(False Positive , FP):被模型预测为正的负样本。
假负(False Negative , FN):被模型预测为负的正样本。
真负(True Negative , TN):被模型预测为负的负样本。
真正率(True Positive Rate,TPR):TPR=TP/(TP+FN),即被预测为正的正样本数 /正样本实际数。
假正率(False Positive Rate,FPR) :FPR=FP/(FP+TN),即被预测为正的负样本数 /负样本实际数。
假负率(False Negative Rate,FNR) :FNR=FN/(TP+FN),即被预测为负的正样本数 /正样本实际数。
真负率(True Negative Rate,TNR):TNR=TN/(TN+FP),即被预测为负的负样本数 /负样本实际数/2

② 准确率(Accuracy)

准确率是最常用的分类性能指标。Accuracy = (TP+TN)/(TP+FN+FP+TN)即正确预测的正反例数 /总数

③ 精确率(Precision)

精确率容易和准确率被混为一谈。其实,精确率只是针对预测正确的正样本而不是所有预测正确的样本。表现为预测出是正的里面有多少真正是正的。可理解为查准率。 Precision = TP/(TP+FP) 即正确预测的正例数 /预测正例总数。

④ 召回率(Recall)

召回率表现出在实际正样本中,分类器能预测出多少。与真正率相等,可理解为查全率。
Recall = TP/(TP+FN),即正确预测的正例数 /实际正例总数

⑤ F1 score

F值是精确率和召回率的调和值,更接近于两个数较小的那个,所以精确率和召回率接近时,F值最大。很多推荐系统的评测指标就是用F值的。
2/F1 = 1/Precision + 1/Recall

⑥ ROC曲线

逻辑回归里面,对于正负例的界定,通常会设一个阈值,大于阈值的为正类,小于阈值为负类。如果我们减小这个阀值,更多的样本会被识别为正类,提高正类的识别率,但同时也会使得更多的负类被错误识别为正类。为了直观表示这一现象,引入ROC。根据分类结果计算得到ROC空间中相应的点,连接这些点就形成ROC curve,横坐标为False Positive Rate(FPR假正率),纵坐标为True Positive Rate(TPR真正率)。一般情况下,这个曲线都应该处于(0,0)和(1,1)连线的上方,如图:

ROC曲线中的四个点和一条线:
点(0,1):即FPR=0, TPR=1,意味着FN=0且FP=0,将所有的样本都正确分类。
点(1,0):即FPR=1,TPR=0,最差分类器,避开了所有正确答案。
点(0,0):即FPR=TPR=0,FP=TP=0,分类器把每个实例都预测为负类。
点(1,1):分类器把每个实例都预测为正类。
总之:ROC曲线越接近左上角,该分类器的性能越好。而且一般来说,如果ROC是光滑的,那么基本可以判断没有太大的overfitting

⑦ AUC

AUC(Area Under Curve)被定义为ROC曲线下的面积(ROC的积分),通常大于0.5小于1。随机挑选一个正样本以及一个负样本,分类器判定正样本的值高于负样本的概率就是 AUC 值。AUC值(面积)越大的分类器,性能越好,如图:

⑧ PR曲线

PR曲线的横坐标是精确率P,纵坐标是召回率R。评价标准和ROC一样,先看平滑不平滑(蓝线明显好些)。一般来说,在同一测试集,上面的比下面的好(绿线比红线好)。当P和R的值接近时,F1值最大,此时画连接(0,0)和(1,1)的线,线和PRC重合的地方的F1是这条线最大的F1(光滑的情况下),此时的F1对于PRC就好像AUC对于ROC一样。一个数字比一条线更方便调型。

有时候模型没有单纯的谁比谁好(比如图二的蓝线和青线),所以选择模型还是要结合具体的使用场景。下面是两个场景:
1,地震的预测 对于地震的预测,我们希望的是RECALL非常高,也就是说每次地震我们都希望预测出来。这个时候我们可以牺牲PRECISION。情愿发出1000次警报,把10次地震都预测正确了,也不要预测100次对了8次漏了两次。
2,嫌疑人定罪 基于不错怪一个好人的原则,对于嫌疑人的定罪我们希望是非常准确的。即时有时候放过了一些罪犯(recall低),但也是值得的。
对于分类器来说,本质上是给一个概率,此时,我们再选择一个CUTOFF点(阀值),高于这个点的判正,低于的判负。那么这个点的选择就需要结合你的具体场景去选择。反过来,场景会决定训练模型时的标准,比如第一个场景中,我们就只看RECALL=99.9999%(地震全中)时的PRECISION,其他指标就变得没有了意义。
当正负样本数量差距不大的情况下,ROC和PR的趋势是差不多的,但是在正负样本分布极不均衡的情况下,PRC比ROC更能真实的反映出实际情况,因为此时ROC曲线看起来似乎很好,但是却在PR上效果一般。

5、逻辑回归的优缺点

5.1 优点

  • LR是以概率的形式输出结果,不只是0和1的判定
  • LR的可解释强,可控性高
  • 训练快,feature engineering之后效果赞
  • 因为结果是概率,可以做ranking model
  • 添加feature简单

5.2 缺点

  • 容易欠拟合,分类精度不高。
  • 数据特征有缺失或者特征空间很大时表现效果并不好。

6、样本不均衡问题解决办法

解决样本不均衡的问题很多,主流的几个如下:

① 样本的过采样和欠采样。

1.过采样:将稀有类别的样本进行复制,通过增加此稀有类样本的数量来平衡数据集。该方法适用于数据量较小的情况。

2.欠抽样:从丰富类别的样本中随机选取和稀有类别相同数目的样本,通过减少丰富类的样本量啦平衡数据集。该方法适用于数据量较大的情况。

3.也可以将过采样和欠采样结合在一起使用。

4.使用SMOTE方法来构造样本。

SMOTE算法是一种过采样的算法。这个算法不是简单的复制已有的数据,而是在原有数据基础上,通过算法产生新生数据。

算法思想:基于距离度量的方式计算两个或多个稀有类样本之间的相似性。然后选择其中的一个样本作为基础样本,再在邻居样本中随机选取一定数量的样本对那个基础样本的一个属性进行噪声。每次处理一个属性,通过这样的方式产生新生数据。

② 使用多个分类器进行分类。

方法一中介绍的过采样,欠采样,都存在相应的问题。
过采样:可能会存在过拟合问题。(可以使用SMOTE算法,增加随机的噪声的方式来改善这个问题)
欠采样:可能会存在信息减少的问题。因为只是利用了一部分数据,所以模型只是学习到了一部分模型。

有以下两种方法可以解决欠采样所带来的问题。

方法一:模型融合 (bagging的思想 )

思路:从丰富类样本中随机的选取(有放回的选取)和稀有类等量样本的数据。和稀有类样本组合成新的训练集。这样我们就产生了多个训练集,并且是互相独立的,然后训练得到多个分类器。若是分类问题,就把多个分类器投票的结果(少数服从多数)作为分类结果。若是回归问题,就将均值作为最后结果。

方法二:增量模型 (boosting的思想)

思路:使用全部的样本作为训练集,得到分类器L1。从L1正确分类的样本中和错误分类的样本中各抽取50%的数据,即循环的一边采样一个,此时训练样本是平衡的,训练得到的分类器作为L2。从L1和L2分类结果中,选取结果不一致的样本作为训练集得到分类器L3.最后投票L1,L2,L3结果得到最后的分类结果。

③ 将二分类问题转换成其他问题。

可以将不平衡的二分类问题转换成异常点检测,或者一分类问题(可使用one-class svm建模)

④ 改变正负类别样本在模型中的权重。

使用代价函数学习得到每个类的权值,大类的权值小,小类的权值大。刚开始,可以设置每个类别的权值与样本个数比例的倒数,然后可以使用过采样进行调优。

7、sklearn参数

sklearn.linear_model.LogisticRegression(penalty=‘l2’, dual=False,
‍tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1,
class_weight=None, random_state=None, solver=‘liblinear’,
max_iter=100, multi_class=‘ovr’, verbose=0, warm_start=False, n_jobs=1)‍

参数名 解释
penalty 正则化选择参数,参数可选值为l1和l2,分别对应l1正则化和l2正则化,默认是l2正则化。
dual 用来指明是否将原问题改成他的对偶问题,对偶问题可以理解成相反问题,比如原问题是求解最大值的线性规划,那么他的对偶问题就是转化为求解最小值的线性规划,适用于样本较小的数据集,因样本小时,计算复杂度较低。
tol 残差收敛条件,默认是0.0001,也就是只需要收敛的时候两步只差<0.0001就停止,可以设置更大或更小。(逻辑回归模型的损失函数是残差平方和)
C 正则化系数,正则化强度的导数,必须是一个正数,值越小,正则化强度越大,即防止过拟合的程度更大。
fit_intercept 是否将截距/方差加入到决策模型中,默认为True。
class_weight:class_weight 是很重要的一个参数,是用来调节正负样本比例的,默认是值为None,也就是正负样本的权重是一样的,你可以以dict的形式给模型传入任意你认为合适的权重比,也可以直接指定一个值“balanced”,模型会根据正负样本的绝对数量比来设定模型最后结果的权重比。
random_state 随机种子的设置,默认是None,如果设置了随机种子,那么每次使用的训练集和测试集都是一样的,这样不管你运行多少次,最后的准确率都是一样的;如果没有设置,那么每次都是不同的训练集和测试集,最后得出的准确率也是不一样的。
solver 用来指明损失函数的优化方法,默认是‘liblinear’方法。
max_iter 算法收敛的最大迭代次数,即求取损失函数最小值的迭代次数,默认是100,
multi_class 分类方法参数选择,‘ovr’和‘multinomial’两个值可以选择,默认值为‘ovr’,如果分类问题是二分类问题,那么这两个参数的效果是一样的,主要体现在多分类问题上。对于多分类问题,"ovr"分类方法是:针对每一类别进行判断时,都会把这个分类问题简化为是/非两类问题;而‘multinomial’是从众多类别中选出两个类别,对这两个类别进行判断,待判断完成后,再从剩下的类别中再选出两类进行判断,直至最后判断完成。
verbose 英文意思是”冗余“,就是会输出一些模型运算过程中的东西(任务进程),默认是False,也就是不需要输出一些不重要的计算过程。
warm_start 是否使用上次的模型结果作为初始化,默认是False,表示不使用。
n_jobs 并行运算数量(核的数量),默认为1,如果设置为-1,则表示将电脑的处理器全部用上。

参考:
https://cloud.tencent.com/developer/article/1146080
https://www.cnblogs.com/zongfa/p/9431807.html
https://blog.csdn.net/pakko/article/details/37878837
https://www.cnblogs.com/lyr2015/p/8711120.html

逻辑回归算法梳理-2相关推荐

  1. 二、逻辑回归算法梳理

    1.逻辑回归与线性回归的联系与区别 联系 逻辑回归与线性回归都属于广义线性回归模型 区别 因变量不同,如果是连续的,就是多重线性回归,如果是二项分布,就是logistic回归.logistic回归的因 ...

  2. 算法梳理(二)逻辑回归算法梳理

    目录 1.逻辑回归与线性回归的联系与区别 2.逻辑回归的原理 3.逻辑回归损失函数推导及优化 4. 正则化与模型评估指标 5.逻辑回归的优缺点 6.样本不均衡问题解决办法 7.sklearn参数 1. ...

  3. 基于机器学习逻辑回归算法完成癌症病人的肿瘤是否良性的判断

    https://www.toutiao.com/a6630407688360575502/ 2018-12-04 22:46:48 逻辑回归算法 虽然逻辑回归算法的名字中有回归二字,但是它却不是回归算 ...

  4. 逻辑回归算法c语言_逻辑回归算法背后的数学

    逻辑回归算法背后的数学 看完深蓝学院的机器学习公开课后,对于逻辑回归部分,打算写篇学习笔记记录总结一下,也和大家共同分享. 1 基本思能 逻辑回归(Logistic Regression)和线性回归( ...

  5. 机器学习——逻辑回归算法

    文章目录 逻辑回归算法 逻辑回归概念 Sigmoid函数 逻辑回归模型 代价函数 最终运用梯度下降求解 实验 总结 逻辑回归算法 首先明确一个概念,逻辑回归并不是解决回归问题,而是解决分类问题,它是通 ...

  6. ML之LoR:基于LoR(逻辑回归)算法对乳腺癌肿瘤(9+1)进行二分类预测(良/恶性)

    ML之LoR:基于LoR(逻辑回归)算法对乳腺癌肿瘤(9+1)进行二分类预测(良/恶性) 目录 输出结果 设计思路 数据集 核心代码 输出结果 Testing accuracy (10 trainin ...

  7. 分析决策树算法和逻辑回归算法的不同之处

    首先我们导入一组airplan.xlsx数据. 数据表中的age表示年龄.FLIGHT_COUNT表示飞行次数.BASE_POINTS_SUM表示飞行里程.runoff_flag表示流失与否,定义1为 ...

  8. 朴素贝叶斯算法和逻辑回归算法的区别?

    朴素贝叶斯算法和逻辑回归算法的区别? 1.两种算法的模型不同: Naive Bayes是一个生成模型,在计算P(y|x)之前,先要从训练数据中计算P(x|y)和P(y)的概率,从而利用贝叶斯公式计算P ...

  9. 机器学习算法平台alink_机器学习-逻辑回归算法

    1-逻辑回归算法原理推导 逻辑回归算法其实是一个分类算法,是非常经典,优秀的算法.一般我们不知道用哪个分类算法的时候,首先用逻辑回归算法试一试:它不仅可以实现二分类算法,还可以解决多分类问题 逻辑回归 ...

最新文章

  1. 计算机考试题选择,(计算机考试题选择.doc
  2. 汇总pandas中dataframe的删除操作
  3. p1273  日常打表
  4. xgboost 的 get_fscore()
  5. C++large fibonacci大斐波那契数列的实现(附完整源码)
  6. 44 | 套路篇:网络性能优化的几个思路(下)
  7. ubuntu php 解析,ubuntu运行后台php服务详解
  8. 2021最新Python量化A股投资必赚策略
  9. 安卓应用安全指南 4.6.1 处理文件 示例代码
  10. RedHat6.4安装IBM MQ7.5
  11. Introduction to Computer Networking学习笔记(十七):Switching and Forwarding 交换与转发
  12. Win10升级要卸载virtualbox virtualbox怎么办
  13. htb:Starting Point
  14. iphone4s蜂窝数据连不上解决方案
  15. x86 单线并发多拨_带宽“单线多拨“倍增大法教程
  16. linux右键无法解压gz文件夹,Linux/centos下zip、tar、gz压缩解压命令
  17. 机器人莫麟_国内机器人/机甲动画汇总——2013年
  18. 常见网络安全产品汇总(私信发送思维导图)
  19. NLP学习(二)—中文分词技术
  20. 深入了解机器学习 (Descending into ML):线性回归

热门文章

  1. 使用计算机我们应遵循哪些行为准则,安全知识题参考答案
  2. 微服务调用链监控开源工具CAT
  3. 支付宝、微信等常用第三方支付接口费率介绍
  4. 【原创】数据分析的荣耀与骄傲
  5. 商用WiFi引发移动互联网入口争夺战
  6. 学习笔记(十五):基于WiFi的步态速度检测
  7. 图像分割 | 人体实例分割数据
  8. Fragment 跳转到指定的Fragment 与 Activity跳转到指定的Fragment 的方法
  9. Ubuntu 20.04 安装配置 GitLab
  10. python教程88--会计教程8-成本分析pandas_profiling库使用