[Machine Learning] 分类(Classification)

本文详细介绍了机器学习中的分类问题,包括分类的应用、如何做分类、生成模型和高斯分布在分类中的作用,以及极大似然估计的概念。通过 Pokemon 精灵的分类案例,解释了为何直接使用回归方法进行分类并不理想,并探讨了分类模型的选择和训练过程。
部署运行你感兴趣的模型镜像

Keywords

  • Classification(分类)
  • Generative Model(生成模型)
  • Gaussian Distribution(高斯分布)
  • Maximum Likelihood(极大似然估计)

Classification(分类)

  • Input:目标 x
  • Output:这个目标x属于n个Class中的哪个Class

Classification的应用

  • Credit Scoring(信用评分)

    • Input:income(收入), savings(存款), profession(职业), age(年龄), past financial history(金融记录) …
    • Output:accept or refuce(接受或者拒绝贷款)
  • Medical Diagnosis(医疗诊断)

    • Input:current symptoms(当前症状), age(年龄), gender(性别), past medical history(医疗记录) …
    • Output:which kind of diseases(哪种类型的疾病)
  • Handwritten character recognition(手写文字辨识)

    • Input:手写字体
    • Output:字体库中的哪个字
  • Face recognition(人脸识别)

    • Input:image of a face(脸部图像)
    • Output:person(人)

Example Application(应用举例)

  • Input:某一只Pokemon精灵(数值化,一只Pokemon由以下七个数值表示)
    • Total:总体强度
    • HP:生命值
    • Attack:攻击力
    • Defence:防御力
    • SP Atk:特殊攻击力
    • SP Def:特殊防御力
    • Speed:速度
  • Output:这一只Pokemon精灵所属系
    • 皮卡丘——雷
    • 杰尼龟——水
    • 妙蛙草——草

How to do Classification(如何做分类)

  • Training data for Calssification(分类所需的训练数据)

    将已经收集的Pokemon精灵转化为元组训练数据(如下图)

  • Classification as Regression(用Regression的方法进行分类)

    可能这时候你会想,我们可不可以用之前学过的《[Machine Learning] Regression(回归)》的方法来进行Classification(分类)呢?

    假设我们现在只需要将Pokemon精灵分成两类,那么:

    • 训练过程:将Class 1代表 y ^ = 1 \hat{y}=1 y^=1,Class 2代表 y ^ = 2 \hat{y}=2 y^=2的数据作为训练数据,然后对Model进行训练
    • 测试过程:将测试数据代入训练好的Model,将最终Model输出值以0为分界点,Model输出值接近1即为Class 1,Model输出值接近-1即为Class 2

    如果这样做我们会遇到什么问题呢?下面我们来探究一下!

    如上图所示,假设我们现在的Model为 y = b + ω 1 x 1 + ω 2 x 2 y = b+\omega_1x_1+\omega_2x_2 y=b+ω1x1+ω2x2,蓝色点为Class 1( y ^ = 1 \hat{y}=1 y^=1),红色点为Class 2( y ^ = − 1 \hat{y}=-1 y^=1),那么我们最终可以训练出一个类似图中绿色线( b + ω 1 x 1 + ω 2 x 2 = 0 b+\omega_1x_1+\omega_2x_2 = 0 b+ω1x1+ω2x2=0)的Model,Model输出值接近1(比如0.98)的点在线的一边,而Model输出值接近-1(比如-0.52)的点在线的另一边,这显然是个不错的结果。

    但是!如果现在我们的训练数据像下图一样分布,然而我们依旧用Regression(回归)的方法的话,那么结果并不会这么完美

    可以发现,图中多出了一些蓝色点Class 1( y ^ = 1 \hat{y}=1 y^=1)的训练数据,它们距离绿色线( b + ω 1 x 1 + ω 2 x 2 = 0 b+\omega_1x_1+\omega_2x_2 = 0 b+ω1x1+ω2x2=0)很远,即 b + ω 1 x 1 + ω 2 x 2 > > 1 b+\omega_1x_1+\omega_2x_2 >> 1 b+ω1x1+ω2x2>>1,那么在训练过程中,机器就会认为它们是错误的点,因为这些点并不接近1,而是远大于1,这会使得Loss Funtion(损失函数)很大

    所以在用Model为 y = b + ω 1 x 1 + ω 2 x 2 y = b+\omega_1x_1+\omega_2x_2 y=b+ω1x1+ω2x2做Regularization(回归)的时候,最终的Model并不会得到向绿色那样的线,而是会向下倾斜,类似紫色线,机器认为这样的好处就是让那些远大于1的点接近1,使得Loss Funtion(损失函数)变小

    显然,现在出现了一种情况,对于Regularization(回归来说),紫色的线是一个好的Function;但是对于Classification(分类)来说,绿色的线才是一个好的Function。因此,用Regularization(回归)的方法来做Classification(分类)并不是一个好的办法!

    现在还有一个问题!就是在做多分类问题的时候,训练数据会出现一种情况:将Class 1代表 y ^ = 1 \hat{y}=1 y^=1,Class 2代表 y ^ = 2 \hat{y}=2 y^=2,Class 3代表 y ^ = 3 \hat{y}=3 y^=3…其实这样做是有问题的。机器会认为,Class 1和Class2接近,因此会有某种关系,Class 2和Class3接近,一次你又会有某种关系…但是,如果实际上这些关系并不存在的话,那么最终训练出来的模型会是一个糟糕的模型!

    那我们应该怎么做呢?

Generative Model(生成模型)

Two Box

首先我们来看两个一模一样的盒子(Box 1 & Box 2),盒子里面放有蓝球和绿球,现在已知:

  • 从Box 1中抽出一个球的概率 P ( B 1 ) = 2 3 P(B_1)=\frac{2}{3} P(B1)=32
  • 从Box 2中抽出一个球的概率 P ( B 2 ) = 1 3 P(B_2)=\frac{1}{3} P(B2)=31
  • 在Box 1里,蓝球占 P ( B l u e ∣ B 1 ) = 4 5    P ( G r e e n ∣ B 1 ) = 1 5 P(Blue|B_1) = \frac{4}{5}\ \ P(Green|B_1) = \frac{1}{5} P(BlueB1)=54  P(GreenB1)=51
  • 在Box 2里,蓝球占 P ( B l u e ∣ B 2 ) = 2 5    P ( G r e e n ∣ B 2 ) = 3 5 P(Blue|B_2) = \frac{2}{5}\ \ P(Green|B_2) = \frac{3}{5} P(BlueB2)=52  P(GreenB2)=53

现在让你求一个蓝球在Box 1中抽中的概率,即 P ( B 1 ∣ B l u e ) P(B_1|Blue) P(B1Blue),学过概率论与数理统计的都知道全概率公式(具体可看《[Machine Learning] 贝叶斯公式 & 全概率公式(Bayes Rule & Total Probability Theorem)》):

P ( B 1 ∣ B l u e ) = P ( B l u e ∣ B 1 ) P ( B 1 ) P ( B l u e ∣ B 1 ) P ( B 1 ) + P ( B l u e ∣ B 2 ) P ( B 2 ) P(B_1|Blue) = \frac{P(Blue|B_1)P(B_1)}{P(Blue|B_1)P(B_1)+P(Blue|B_2)P(B_2)} P(B1Blue)=P(BlueB1)P(B1)+P(BlueB2)P(B2)P(BlueB1)P(B1)

那这个跟Classification(分类)有什么关系呢?我们再来看一下!

Two Class

我们把Box换成Class,里面装了两种不同系的Pokemon精灵。现在已知一个Pokemon精灵 x x x,问这个Pokemon精灵 x x x在某一个Class中的几率各自是多少呢?

这时候我们就需要知道以下条件:

  • 从Class 1抽出一个Pokemon精灵的概率 P ( C 1 ) P(C_1) P(C1)
  • 从Class 2抽出一个Pokemon精灵的概率 P ( C 2 ) P(C_2) P(C2)
  • 在Class 1中,抽出(Sample)是 x x x的概率 P ( x ∣ C 1 ) P(x|C_1) P(xC1)
  • 在Class 2中,抽出(Sample)是 x x x的概率 P ( x ∣ C 2 ) P(x|C_2) P(xC2)

有了这些条件,我们就可以确定Pokemon精灵 x x x来自Class 1的概率:

P ( C 1 ∣ x ) = P ( x ∣ C 1 ) P ( C 1 ) P ( x ∣ C 1 ) P ( C 1 ) + P ( x ∣ C 2 ) P ( C 2 ) P(C_1|x) = \frac{P(x|C_1)P(C_1)}{P(x|C_1)P(C_1)+P(x|C_2)P(C_2)} P(C1x)=P(xC1)P(C1)+P(xC2)P(C2)P(xC1)P(C1)

知道了这些,我们就可以比较一只Pokemon精灵,它来自Class 1和来自Class 2的概率哪个更大,概率最大的那个就是正确答案!

所以如果我们考虑二元分类的话,我们现在需要算的就是那四个值 P ( C 1 ) P(C_1) P(C1) P ( C 2 ) P(C_2) P(C2) P ( x ∣ C 1 ) P(x|C_1) P(xC1) P ( x ∣ C 2 ) P(x|C_2) P(xC2)

那怎么知道这些值呢?我们就希望从Training Data中去把这些值估测出来。这种方法就是Generative Model(生成模型)

有了Generative Model(生成模型),我们就可以计算某个 x x x出现的概率:
P ( x ) = P ( x ∣ C 1 ) P ( C 1 ) + P ( x ∣ C 2 ) P ( C 2 ) P(x) = P(x|C_1)P(C_1)+P(x|C_2)P(C_2) P(x)=P(xC1)P(C1)+P(xC2)P(C2)

现在假设Class 1为Water(水)系,Class 2为Normal(一般)系,在Training Data(训练集)中:由79只Pokemon精灵为Water(水)系还有61只Pokemon精灵为Normal(一般)系。则:

  • P ( C 1 ) = 79 / ( 79 + 61 ) = 0.56 P(C_1) = 79/(79+61) = 0.56 P(C1)=79/(79+61)=0.56
  • P ( C 2 ) = 61 / ( 79 + 61 ) = 0.44 P(C_2) = 61/(79+61) = 0.44 P(C2)=61/(79+61)=0.44

那我们现在怎么计算一只未知的Pokemon精灵 x x x分别来自在Class 1和Class 2中的概率呢?

Probability from class

我们知道,每一个Pokemon精灵都被一个向量所表示,而向量中的值就是Pokemon精灵的特征值(feature)。

为了可视化,我们暂时先考虑两个特征值:Defence(防御力)和SP Defence(特殊防御力)。

首先,我们将79只Water(水)系精灵的Defence(防御力)和SP Defence(特殊防御力)可视化(如上图)。所以图中每一个点都代表了一只Water(水)系Pokemon精灵。

现在,出现了一只未知系的Pokemon精灵 x x x,我们要想办法估测出这只Pokemon精灵 x x x是Water(水)系的概率。

我们可以假设Water(水)系Pokemon精灵的概率分布满足Gaussian Distribution(高斯分布),而这79只Water(水)系精灵就是为了让我们算出这个Gaussian Distribution(高斯分布)的具体公式(自变量为Pokemon精灵的Defence和SP Defence),从而估测出这只Pokemon精灵 x x x是Water(水)系的概率。

可能这里你会问,Gaussian Distribution(高斯分布)是什么呢?

Gaussian Distribution(高斯分布)

如果你不知道Gaussian Distribution(高斯分布),这里你可以简单把它理解成一个公式:
f μ , Σ ( x ) = 1 ( 2 π ) D 2 1 ∣ ∑ ∣ 1 2 e x p { − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) } f_{\mu,\Sigma}(x) = \frac{1}{(2\pi)^{\frac{D}{2}}}\frac{1}{|\sum|^{\frac{1}{2}}}exp\{-\frac{1}{2}(x-\mu)^T\Sigma^{-1}(x-\mu)\} fμ,Σ(x)=(2π)2D1211exp{21(xμ)TΣ1(xμ)}

其中:

  • Input:向量x
  • Output:取样为x的概率密度
  • Gaussian Distribution(高斯分布)的形状决定因素:mean(期望 μ \mu μcovariance matrix(协方差矩阵 Σ \Sigma Σ
  • μ \mu μ不同, Σ \Sigma Σ相同,代表几率分布最高点的地方是不一样的
  • μ \mu μ相同, Σ \Sigma Σ不同,代表几率分布最高点是一样的,但是分散程度是不一样的

Gaussian Distribution(高斯分布)举例说明

如上图,假设现在我们已知 μ \mu μ确定Gaussian Distribution最高点的位置)和 Σ \Sigma Σ确定Gaussian Distribution的形状),那我们就可以在Defence(防御力)和SP Defence(特殊防御力)分布图中确定Gaussian Distribution(高斯分布)的位置,现在如果有一个New x x x(新的Pokemon精灵 x x x)出现,那么我们就可以将这个Pokemon精灵 x x x代入一致的Gaussian Distribution(高斯分布)公式中,从而计算出这个新的Pokemon精灵 x x x的是Water(水)系的概率。
f μ , Σ ( x ) = 1 ( 2 π ) D 2 1 ∣ ∑ ∣ 1 2 e x p { − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) } \\ f_{\mu,\Sigma}(x) = \frac{1}{(2\pi)^{\frac{D}{2}}}\frac{1}{|\sum|^{\frac{1}{2}}}exp\{-\frac{1}{2}(x-\mu)^T\Sigma^{-1}(x-\mu)\} \\ fμ,Σ(x)=(2π)2D1211exp{21(xμ)TΣ1(xμ)}

所以现在我们需要确定mean(期望) μ \mu μ和covariance matrix(协方差矩阵) Σ \Sigma Σ

那怎么计算呢?

Maximum likelihood(极大似然估计)

我们现在已经知道,不同的 μ \mu μ Σ \Sigma Σ可以确定Gaussian Distribution(高斯分布),而不同的Gaussian Distribution(高斯分布)对于图中79个点得到的概率是不同的(different likelihood)。

因为现在的这79个Pokemon精灵已经确定是Water(水)系的,所以我们最终得到的Gaussian Distribution(高斯分布)应该是能够让这79个点代入后概率是最大的。

即有Maximum likelihood(极大似然估计)式子:

L ( μ , Σ ) = f μ , Σ ( x 1 ) f μ , Σ ( x 2 ) f μ , Σ ( x 3 ) . . . f μ , Σ ( x 7 9 ) L(\mu,\Sigma) = f_{\mu,\Sigma}(x^1)f_{\mu,\Sigma}(x^2)f_{\mu,\Sigma}(x^3)...f_{\mu,\Sigma}(x^79)\\ L(μ,Σ)=fμ,Σ(x1)fμ,Σ(x2)fμ,Σ(x3)...fμ,Σ(x79)
f μ , Σ ( x ) = 1 ( 2 π ) D 2 1 ∣ ∑ ∣ 1 2 e x p { − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) } f_{\mu,\Sigma}(x) = \frac{1}{(2\pi)^{\frac{D}{2}}}\frac{1}{|\sum|^{\frac{1}{2}}}exp\{-\frac{1}{2}(x-\mu)^T\Sigma^{-1}(x-\mu)\}\\ fμ,Σ(x)=(2π)2D1211exp{21(xμ)TΣ1(xμ)}
μ ∗ , Σ ∗ = a r g max ⁡ μ , Σ L ( μ , Σ ) \mu^*,\Sigma^* = arg\max_{\mu,\Sigma}L(\mu,\Sigma) μ,Σ=argμ,ΣmaxL(μ,Σ)

这个式子由固定公式解(假装我们记住了这个公式解),即:
μ ∗ = 1 79 ∑ n = 1 79 x n \mu^* = \frac{1}{79}\sum_{n=1}^{79}x^n μ=791n=179xn
Σ ∗ = 1 79 ∑ n = 1 79 ( x n − μ ∗ ) ( x n − μ ∗ ) T \Sigma^*=\frac{1}{79}\sum_{n=1}^{79}(x^n-\mu^*)(x^n-\mu^*)^T Σ=791n=179(xnμ)(xnμ)T

最终,我们将Water(水)系和Normal(一般)系的结果都计算出来后(如下图)

现在,我们就可以使用以下公式进行分类了。比如:如果 P ( C 1 ∣ x ) > 0.5 P(C_1|x)>0.5 P(C1x)>0.5,那么就可以说明 x x x是属于Class 1(Water)

那最终结果怎么样呢?

How’s the results?

如上图,我们用两种图来表示最终的结果(图中的结果是对于Training Data而言的)

  • 左图:图中红色点代表Class 2(Normal),蓝色点代表Class 1(Water),而图中不同的颜色代表不同的 P ( C 1 ∣ x ) P(C_1|x) P(C1x)(红颜色代表概率大,蓝颜色代表概率小)
  • 右图:图中以 P ( C 1 ∣ x ) = 0.5 P(C_1|x)=0.5 P(C1x)=0.5为分界线,蓝颜色代表 P ( C 1 ∣ x ) < 0.5 P(C_1|x)<0.5 P(C1x)<0.5,红颜色代表 P ( C 1 ∣ x ) > 0.5 P(C_1|x)>0.5 P(C1x)>0.5

我们再来看一下Model在Testing Data中的结果,发现效果其实并不是这么好,准确率最终只有47%,不过没有关系,这也只是取了两个特征值Defence(防御力)和SP Defence(特殊防御力)的情况下的准确率。

如果我们将所有的特征值(Total、HP、Attack、SP Att、Defence、SP De、Speed)都放进Model进行Classification(分类)Testing Data结果会怎样呢?

  • μ 1 、 μ 2 : 7 − d i m v e c t o r \mu^1、\mu^2:7-dim vector μ1μ27dimvector
  • Σ 1 、 Σ 2 : 7 × 7 m a t r i x \Sigma^1、\Sigma^2:7\times7 matrix Σ1Σ27×7matrix

最终准确率为54%…很糟糕,但是没关系!我们学习了Classification(分类)的过程!

文章就到这里,还请大家帮忙勘误!

(如果文章对您有帮助,您的点赞或评论就是对我写Blog最大的支持!谢谢~)

您可能感兴趣的与本文相关的镜像

Wan2.2-T2V-A5B

Wan2.2-T2V-A5B

文生视频
Wan2.2

Wan2.2是由通义万相开源高效文本到视频生成模型,是有​50亿参数的轻量级视频生成模型,专为快速内容创作优化。支持480P视频生成,具备优秀的时序连贯性和运动推理能力

<think>好的,我现在需要解决用户关于pandas读取CSV文件路径错误的问题。用户提到在使用pandas的read_csv函数时遇到了路径错误,我需要提供解决方案。 首先,用户可能的问题来源是什么?路径错误通常有几个常见原因:相对路径与绝对路径混淆、路径中的斜杠方向错误、文件不在当前工作目录下、文件名拼写错误或大小写不一致、特殊字符或空格未处理,以及权限问题。我应该逐一分析这些可能性。 接下来,我需要回忆pandas中read_csv的基本用法。例如,正确的路径格式是怎样的?在Windows系统中,路径通常使用反斜杠,但在Python字符串中需要转义,或者使用原始字符串。而在其他操作系统中,使用正斜杠即可。此外,相对路径的基准是当前工作目录,这可能和用户脚本所在目录不同,导致问题。 然后,我需要考虑如何帮助用户确定当前工作目录。可以通过os.getcwd()来获取,或者建议使用绝对路径来避免歧义。同时,路径拼接最好使用os.path.join来处理不同操作系统的差异,比如用户提供的示例代码中有os.path.join(ROOT_PATH, files.filename),这可能是上传文件时的处理方式,可以引用这个例子来说明正确的方法。 另外,用户可能在使用IDE时,当前工作目录设置不同,比如PyCharm或Jupyter Notebook的工作目录可能与脚本所在目录不一致。这时候需要建议用户检查IDE的设置,或者显式地更改工作目录。 还要考虑文件名是否正确,包括扩展名是否完整(比如.csv是否被遗漏),以及大小写是否匹配,尤其是在区分大小写的系统如Linux中。此外,路径中的特殊字符或空格是否需要转义或使用引号包裹。 权限问题虽然较少见,但也不能排除。如果文件被其他程序占用或用户没有读取权限,也会导致错误。需要提醒用户检查文件是否可读。 接下来,我应该给出具体的解决步骤。例如,首先检查文件路径是否正确,使用绝对路径测试,处理斜杠方向,使用os模块进行路径拼接,处理特殊字符,检查工作目录,验证文件存在性和权限,以及可能的异常处理。 还可以提供代码示例,比如使用try-except块来捕获异常,并打印详细的错误信息,帮助用户诊断问题。同时,结合用户提供的引用内容,如引用[1]中的os.path.join方法,引用[3]中正确读取date列的例子,可以增强回答的可信度。 最后,生成相关问题,帮助用户深入理解其他可能的文件处理问题,比如读取Excel、处理路径不存在的情况,或者处理不同编码的CSV文件。这些问题应该与用户的问题相关,但扩展了范围,以便用户后续参考。</think>### 解决pandas读取CSV文件路径错误的步骤 #### 1. **检查文件路径格式** - **绝对路径**:直接使用文件的完整路径(适用于明确文件位置的情况) ```python df = pd.read_csv(r"C:\Users\user\data\file.csv") # Windows路径使用原始字符串 df = pd.read_csv("/home/user/data/file.csv") # Linux/macOS路径 ``` - **相对路径**:确保路径相对于当前工作目录(可通过`os.getcwd()`查看当前目录)[^3]。 #### 2. **处理路径分隔符** - Windows路径建议使用`/`或双反斜杠`\\`: ```python df = pd.read_csv("data\\file.csv") # 使用转义反斜杠 df = pd.read_csv("data/file.csv") # 使用正斜杠 ``` #### 3. **使用`os.path`处理跨平台兼容性** - 通过`os.path.join`自动适配不同操作系统的路径分隔符: ```python import os file_path = os.path.join("data", "subfolder", "file.csv") df = pd.read_csv(file_path) ``` 类似引用[1]中`os.path.join(ROOT_PATH, files.filename)`的用法[^1]。 #### 4. **处理文件名与扩展名** - 检查文件名是否拼写正确(包括大小写),例如`file.CSV`与`file.csv`可能不兼容。 - 确保文件扩展名完整,例如`file.csv`而非`file`。 #### 5. **处理特殊字符或空格** - 路径含空格时需用引号包裹或转义: ```python df = pd.read_csv(r"C:\My Folder\file.csv") # 使用原始字符串 ``` #### 6. **验证文件存在性** - 使用`os.path.exists`检查路径是否存在: ```python import os if os.path.exists("data/file.csv"): df = pd.read_csv("data/file.csv") else: print("文件不存在!") ``` #### 7. **异常捕获与调试** - 使用`try-except`捕获具体错误: ```python try: df = pd.read_csv("data/file.csv") except FileNotFoundError: print("文件路径错误,请检查路径!") ``` --- ### 示例代码 ```python import pandas as pd import os # 方法1:使用绝对路径(推荐) abs_path = r"C:\project\data\file.csv" df = pd.read_csv(abs_path) # 方法2:动态拼接路径 base_dir = "data" file_name = "file.csv" full_path = os.path.join(base_dir, file_name) df = pd.read_csv(full_path) ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值