Udacity 机器学习笔记_2 监督学习

因本人刚开始写博客,学识经验有限,如有不正之处望读者指正,不胜感激;也望借此平台留下学习笔记以温故而知新。这篇博客是复盘整理 Udacity 机器学习工程师课程的学习笔记。

均方误差与总平方误差(或绝对误差)

一个潜在疑问是:如何判断应该使用均方误差还是总平方误差(或绝对误差)?

总平方误差是指每个点的误差之和,方程式为:

M = \sum_{i=1}^m \frac{1}{2} (y - \hat{y})^2,M=∑i=1m​21​(y−y^​)2,

均方误差是指这些误差的平均值,方程式为:

T = \sum_{i=1}^m \frac{1}{2m}(y - \hat{y})^2.T=∑i=1m​2m1​(y−y^​)2.

其中 mm 是数据点的数量,

好消息是,选择哪个并不重要。可以看出,总平方误差是多个均方误差相加的结果,因为

M = mT.M=mT.

因此,既然导数是线性方程, TT 的梯度也是 mm 乘以 MM 的梯度。

但是,梯度下降步骤包括减去误差的梯度乘以学习速率 \alphaα。因此,选择均方误差还是总平方误差只是选择不同的学习速率。

在现实中,我们可以借助算法判断什么样的学习速率比较合适。因此,如果我们使用均方误差或总平方误差,算法将只是选择不同的学习速率。

批量梯度下降法与随机梯度下降法

到目前为止,我们已经见过两种线性回归方法。

  • 逐个地在每个数据点应用平方(或绝对)误差,并重复这一流程很多次。
  • 同时在每个数据点应用平方(或绝对)误差,并重复这一流程很多次。

具体而言,向数据点应用平方(或绝对)误差时,就会获得可以与模型权重相加的值。我们可以加上这些值,更新权重,然后在下个数据点应用平方(或绝对)误差。或者同时对所有点计算这些值,加上它们,然后使用这些值的和更新权重。

后者第二种方法叫做批量梯度下降法。前者第一种方法叫做随机梯度下降法

问题是,实际操作中使用哪种方法?

实际上,在大部分情况下,两种都不用。思考以下情形:如果你的数据十分庞大,两种方法的计算速度都将会很缓慢。线性回归的最佳方式是将数据拆分成很多小批次。每个批次都大概具有相同数量的数据点。然后使用每个批次更新权重。这种方法叫做小批次梯度下降法

线性回归

在此部分,你将使用线性回归根据体质指数 (BMI) 预测预期寿命。在预测前,我们先了解一下构建此模型所需的工具。

对于你的线性回归模型,你将使用 scikit-learn 的 LinearRegression 类。此类会提供函数 fit() 来将模型与数据进行拟合。

>>> from sklearn.linear_model import LinearRegression
>>> model = LinearRegression()
>>> model.fit(x_values, y_values)

在上述示例中,model 变量是拟合到数据 x_values 和 y_values 的线性回归模型。拟合模型意味着寻找拟合训练数据的最佳线条。我们使用模型的 predict() 函数做出两个预测。

>>> print(model.predict([ [127], [248] ]))
[[ 438.94308857, 127.14839521]]

该模型返回了一个预测数组,每个输入数组一个预测结果。第一个输入 [127] 的预测结果是 438.94308857。第二个输入 [248] 的预测结果是 127.14839521。用 [127] 这样的数组(而不只是 127)进行预测的原因是模型可以使用多个特征进行预测。我们将在这节课的稍后部分讲解如何在线性回归中使用多个变量。暂时先继续使用一个值。

线性回归练习

在这道练习中,你将使用关于全球男性平均出生预期寿命和平均 BMI 的数据。该数据来自 Gapminder

你可以在以下练习的 bmi_and_life_expectancy.csv 标签页中找到数据文件。它包含以下三列数据:

  • Country – 样本的出生国家/地区。
  • Life expectancy – 样本在该国家/地区的平均出生预期寿命。
  • BMI – 该国家/地区的男性 BMI 均值。

你需要完成以下步骤:

1. 加载数据

  • 数据位于文件 bmi_and_life_expectancy.csv中。
  • 使用 pandas read_csv 将数据加载到数据帧中(别忘了导入 pandas!)
  • 将数据帧赋值给变量 bmi_life_data

2. 构建线性回归模型

  • 使用 scikit-learn 的 LinearRegression 创建回归模型并将其赋值给 bmi_life_model
  • 将模型与数据进行拟合。

3. 使用模型进行预测

  • 使用值为 21.07931 的 BMI 进行预测,并将结果赋值给变量 laos_life_exp
# TODO: Add import statements
import pandas as pd
from sklearn.linear_model import LinearRegression

# Assign the dataframe to this variable.
# TODO: Load the data
bmi_life_data = pd.read_csv("bmi_and_life_expectancy.csv")

# Make and fit the linear regression model
#TODO: Fit the model and Assign it to bmi_life_model
bmi_life_model = LinearRegression()
bmi_life_model.fit(bmi_life_data[['BMI']], bmi_life_data[['Life expectancy']])

# Mak a prediction using the model
# TODO: Predict life expectancy for a BMI value of 21.07931
laos_life_exp = bmi_life_model.predict(21.07931)

多元线性回归

在上一部分,你了解了如何使用 BMI 预测预期寿命。在此例中,BMI 是预测器,也称为自变量。预测器是你将查看的变量,以便对其他变量做出预测,你尝试预测的值称为因变量。在此示例中,预期寿命是因变量。

现在假设我们获得了每人的心率数据。我们可以同时使用 BMI 和心率预测寿命期限吗?

当然可以!正如在上个视频中看到的,我们可以使用多元线性回归进行预测。

如果你要预测的结果取决于多个变量,可以创建一个更复杂的模型来考虑多个变量。只要这些变量与要解决的问题相关,使用更多自变量/预测器变量就有助于做出更好的预测。

如果只有一个预测器,则线性回归模型是一条线,但是如果添加更多的预测器变量,就会增加更多的维度。

如果有一个预测器变量,线条的方程是

y = m x + by=mx+b

图形可能如下所示:

带有一个预测器变量的线性回归

添加一个预测器变量,变成两个预测器变量后,预测方程是

y = m_1 x_1 + m_2 x_2 + by=m1​x1​+m2​x2​+b

要用图形表示,我们需要三维图形,并将线性回归模型表示成一个平面:

带有两个预测器变量的线性回归

你可以使用两个以上的预测器变量,实际上可以使用任意多个,只要有用即可!如果你使用 nn 个预测器变量,那么模型可以用以下方程表示:

y = m_{1} x_{1} + m_{2} x_{2} + m_{3} x_{3}+ ... +m_{n} x_{n} + by=m1​x1​+m2​x2​+m3​x3​+...+mn​xn​+b

如果模型有多个预测器变量,则很难用图形呈现,但幸运的是,关于线性回归的所有其他方面都保持不变。我们依然可以通过相同的方式拟合模型并作出预测,我们来试试吧!

编程练习:多元线性回归

在此练习中,你将使用 波士顿房价数据集。该数据集包含 506 座房子的 13 个特征,均值为 $1000's。你将用一个模型拟合这 13 个特征,以预测房价。

你需要完成以下步骤:

1. 构建线性回归模型 *使用scikit-learn 的 LinearRegression 创建回归模型并将其赋值给 model

  • 将模型与数据拟合。

2. 使用该模型进行预测

  • 预测 sample_house 的值。
from sklearn.linear_model import LinearRegression
from sklearn.datasets import load_boston

# Load the data from the boston house-prices dataset 
boston_data = load_boston()
x = boston_data['data']
y = boston_data['target']

# Make and fit the linear regression model
# TODO: Fit the model and Assign it to the model variable
model = LinearRegression()
model.fit(x, y)

# Make a prediction using the model
sample_house = [[2.29690000e-01, 0.00000000e+00, 1.05900000e+01, 0.00000000e+00, 4.89000000e-01,
                6.32600000e+00, 5.25000000e+01, 4.35490000e+00, 4.00000000e+00, 2.77000000e+02,
                1.86000000e+01, 3.94870000e+02, 1.09700000e+01]]
# TODO: Predict housing price for the sample_house
prediction = model.predict(sample_house)

编写感知器算法

该编写代码了!在此练习中,你将实现感知器算法以分类下面的数据(位于文件 data.csv 中)。

感知器步骤如下所示。对于坐标轴为 (p,q)(p,q) 的点,标签 y,以及等式 \hat{y} = step(w_1x_1 + w_2x_2 + b)y^​=step(w1​x1​+w2​x2​+b) 给出的预测

  • 如果点分类正确,则什么也不做。
  • 如果点分类为正,但是标签为负,则分别减去 \alpha p, \alpha q,αp,αq, 和 \alphaα 至 w_1, w_2,w1​,w2​, 和 bb
  • 如果点分类为负,但是标签为正,则分别将 \alpha p, \alpha q,αp,αq, 和 \alphaα 加到 w_1, w_2,w1​,w2​, 和 bb 上。

然后点击测试运行绘出感知器算法给出的解决方案。它实际上会画出一组虚线,显示算法如何接近最佳解决方案(用黑色实线表示)。

请随意改动算法的参数(epoch 数量、学习速率,甚至随机化初始参数),看看初始条件对解决方案有何影响!

def perceptronStep(X, y, W, b, learn_rate = 0.01):
    for i in range(len(X)):
        y_hat = prediction(X[i],W,b)
        if y[i]-y_hat == 1:
            W[0] += X[i][0]*learn_rate
            W[1] += X[i][1]*learn_rate
            b += learn_rate
        elif y[i]-y_hat == -1:
            W[0] -= X[i][0]*learn_rate
            W[1] -= X[i][1]*learn_rate
            b -= learn_rate
    return W, b

决策树的超参数

在决策树中有一些相当重要的超参数:

最大深度

决策树的最大深度指树根和叶子之间的最大长度。当决策树的最大深度为 kk 时,它最多可以拥有 2^k2k 片叶子。

Maximum depth of a decision tree 决策树的最大深度

每片叶子的最小样本数

在分裂节点时,很有可能一片叶子上有 99 个样本,而另一片叶子上只有 1 个样本。这将使我们陷入困境,并造成资源和时间的浪费。如果想避免这种问题,我们可以设置每片叶子允许的最小样本数。

每片叶子的最小样本数

这个数字可以被指定为一个整数,也可以是一个浮点数。如果它是整数,它将表示这片叶子上的最小样本数。如果它是个浮点数,它将被视作每片叶子上的最小样本比例。比如,0.1 或 10% 表示如果一片叶子上的样本数量小于该节点中样本数量的 10%,这种分裂将不被允许。

每次分裂的最小样本数

这个参数与每片叶子上的最小样本树相同,只不过是应用在节点的分裂当中。

最大特征数

有时,我们会遇到特征数量过于庞大,而无法建立决策树的情况。在这种状况下,对于每一个分裂,我们都需要检查整个数据集中的每一个特征。这种过程极为繁琐。而解决方案之一是限制每个分裂中查找的特征数。如果这个数字足够庞大,我们很有可能在查找的特征中找到良好特征(尽管也许并不是完美特征)。然而,如果这个数字小于特征数,这将极大加快我们的计算速度。

在此部分,你将使用决策树拟合给定样本数据集。

在此之前,我们先了解下构建此模型所需的工具。

对于决策树模型,你将使用 scikit-learn 的 Decision Tree Classifier 类。该类提供了定义模型并将模型与数据进行拟合的函数。

>>> from sklearn.tree import DecisionTreeClassifier
>>> model = DecisionTreeClassifier()
>>> model.fit(x_values, y_values)

在上述示例中,model 变量是一个拟合到数据 x_values 和 y_values 的决策树模型。拟合模型是指寻找拟合训练数据的最佳线条。我们使用模型的 predict() 函数进行两项预测。

>>> print(model.predict([ [0.2, 0.8], [0.5, 0.4] ]))
[[ 0., 1.]]

该模型返回了一个预测结果数组,每个输入数组一个预测结果。第一个输入 [0.2, 0.8] 的预测结果为 0.。第二个输入 [0.5, 0.4] 的预测结果为 1.

超参数

当我们定义模型时,可以指定超参数。在实践中,最常见的超参数包括:

  • max_depth:树中的最大层级数量。
  • min_samples_leaf:叶子允许的最低样本数量。
  • min_samples_split:拆分内部节点所需的最低样本数量。
  • max_features:寻找最佳拆分方法时要考虑的特征数量。

例如,在此例中,我们定义了一个模型:树的最大深度 max_depth 为7,每个叶子的最低元素数量 min_samples_leaf 是 10。

>>> model = DecisionTreeClassifier(max_depth = 7, min_samples_leaf = 10)

决策树练习

在此练习中,你将处理以下样本数据集,目标是定义一个准确率达到 100% 的模型。

你可以在以下练习的“data.csv”标签页中找到数据文件。它包含三列,前两列由点的坐标组成,第三列为标签。

我们将为你加载数据并将数据拆分为特征 X 和标签 y

你需要完成以下每步:

1. 构建决策树模型 *使用 scikit-learn 的 DecisionTree 构建决策树分类模型,并将其赋值给变量 model

2. 将模型与数据进行拟合

  • 你不需要指定任何超参数,因为默认的超参数将以 100% 的准确率拟合数据。但是,建议你实验这些超参数,例如 max_depth 和 min_samples_leaf,并尝试找到最简单的潜在模型,即最不太可能过拟合的模型!

3. 使用模型进行预测

  • 预测训练集的标签,并将此列表赋值给变量 y_pred

4. 计算模型的准确率

点击 测试答案 (Test Run) 后,你将能够看到模型的边界区域,这些边界区域可以帮助你调整并获得正确的参数(如果需要的话)。

注意:这道练习要求在训练集上的准确率达到 100%。当然,要小心过拟合!如果参数选择非常大的值,你将很好地拟合训练集,但是可能并不是最好的模型。尝试寻找能够完成任务的最小可能参数,这样过拟合的几率就更小,虽然我们不会对此进行评分。

# Import statements 
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
import pandas as pd
import numpy as np

# Read the data.
data = np.asarray(pd.read_csv('data.csv', header=None))
# Assign the features to the variable X, and the labels to the variable y. 
X = data[:,0:2]
y = data[:,2]

# TODO: Create the decision tree model and assign it to the variable model.
model = DecisionTreeClassifier()

# TODO: Fit the model.
model.fit(X,y)

# TODO: Make predictions. Store them in the variable y_pred.
y_pred = model.predict(X)

# TODO: Calculate the accuracy and assign it to the variable acc.
acc = accuracy_score(y, y_pred)

 

项目:构建垃圾邮件分类器

简介

垃圾邮件检测是现今网络中最重要的机器学习应用案例领。几乎所有的大型邮箱服务提供商都内置了垃圾邮件检测系统,并自动将此类邮件归类为“垃圾邮件”。

在此项目中,我们将使用朴素贝叶斯算法来创建一个模型,并根据我们对模型展开的训练将数据集文本分类为是否为垃圾文本。你需要直观地了解哪些文本信息属于垃圾信息。

垃圾邮件是什么?

通常包含字眼“免费('free')”、“赢取('win')”、“获奖者('winner')”、“现金('cash')”、“奖品('prize)”等,因为这些字眼专门用于吸引你的注意,诱惑你打开邮件。此外,垃圾邮件喜欢让所有单词都大写,并使用大量的感叹号。对收件人来说,通常很容易就判断出是否为垃圾邮件,我们的目标是训练模型来帮助我们识别垃圾邮件!

识别垃圾邮件是二元分类问题,因为邮件要么“是垃圾邮件('Spam')”,要么“不是垃圾邮件('Not Spam')”,不会再有第三种情况。此外,这是监督学习问题,因为我们知道要预测什么。我们将向模型提供带有标签的数据集,使其从中学习规律并作出未来预测。

概述

此项目分为以下步骤:

  • 第 0 步: 朴素贝叶斯定理简介
  • 第 1.1 步: 了解我们的数据集
  • 第 1.2 步: 数据预处理
  • 第 2.1 步: Bag of Words(BoW)
  • 第 2.2 步: 从头实现 BoW
  • 第 2.3 步: 在 scikit-learn 中实现 Bag of Words
  • 第 3.1 步: 训练和测试数据集
  • 第 3.2 步: 向我们的数据集中应用 Bag of Words 处理流程
  • 第 4.1 步: 从头实现贝叶斯定理
  • 第 4.2 步: 从头实现朴素贝叶斯定理
  • 第 5 步: 使用 scikit-learn 实现朴素贝叶斯定理
  • 第 6 步: 评估模型
  • 第 7 步: 结论

(选修)边际误差计算

在本选修部分,我们将会计算 SVM 中两个间隔之间的距离。

首先,W = (w_1, w_2)W=(w1​,w2​) ,x = (x_1,x_2)x=(x1​,x2​),并且 Wx = w_1x_1 + w_2x_2Wx=w1​x1​+w2​x2​.

请注意,在这里我们有三条线,方程如下:

  • Wx+b=1Wx+b=1
  • Wx+b=0Wx+b=0
  • Wx+b=-1Wx+b=−1

由于这三条线为等距平行线,要想确定第一条线和第三条线之间的距离,我们只需要计算前两条线之间的距离,接着将这个数字乘以二。这也就是说我们需要确定图 1 中前两条线之间的距离。

图 1

请注意,由于我们只需计算线条之间的距离,因此也可以将线条平移,直到其中一条线与原点相交(图 2)。这时得到的方程如下:

  • Wx=0Wx=0
  • Wx=1Wx=1

图 2

现在,第一条线的方程为 Wx=0Wx=0,这意味着它与标记为红色的向量(图 3) W = (w_1, w_2)W=(w1​,w2​) 垂直。

图 3

该向量与方程为 Wx=1Wx=1 的线条相交于蓝点(图 4)。假设该点的坐标为 (p,q)(p,q)。那么我们可以得到下面两个结果:

  • w_1p + w_2q = 1w1​p+w2​q=1 (由于该点位于这条线上),并且
  • 由于该点位于向量 W = (w_1, w_2)W=(w1​,w2​) 上,(p,q)(p,q) 是 (w_1, w_2)(w1​,w2​) 的倍数。

我们可以这样求解这个方程:对于某个 k 值而言,有 (p,q) = k(w_1, w_2)(p,q)=k(w1​,w2​)。那么我们的第一个方程将被转换为 k(w_1^2 + w_2^2) = 1.k(w12​+w22​)=1.。因此,k = \frac{1}{w_1^2+w_2^2} = \frac{1}{|W|^2}k=w12​+w22​1​=∣W∣21​。这也就是说,蓝点表示向量 \frac{W}{|W|^2}∣W∣2W​,如图 4 所示。

图 4

现在,两条线之间的距离是蓝色向量的范数。由于分母是一个标量,向量 \frac{W}{|W|^2}∣W∣2W​ 的范数正是 \frac{|W|}{|W|^2}∣W∣2∣W∣​,与 \frac{1}{|W|}∣W∣1​(图 5)相同。

图 5

最后,最终距离是这连续两条平行线(图 6)之间的距离之和。由于每两条线之间的距离为 \frac{1}{|W|}∣W∣1​,那么总距离为 \frac{2}{|W|}∣W∣2​。

图 6

sklearn 中的支持向量机

在此部分,你将使用支持向量机拟合给定样本数据集。

在此之前,我们先了解下构建此模型所需的工具。

对于支持向量机模型,你将使用 scikit-learn 的 SVC 类。该类提供了定义模型并将模型与数据进行拟合的函数。

>>> from sklearn.svm import SVC
>>> model = SVC()
>>> model.fit(x_values, y_values)

在上述示例中,model 变量是一个拟合到数据 x_values 和 y_values 的支持向量机模型。拟合模型是指寻找拟合训练数据的最佳界线。我们使用模型的 predict() 函数进行两项预测。

>>> print(model.predict([ [0.2, 0.8], [0.5, 0.4] ]))
[[ 0., 1.]]

该模型返回了一个预测结果数组,每个输入数组一个预测结果。第一个输入 [0.2, 0.8] 的预测结果为 0.。第二个输入 [0.5, 0.4] 的预测结果为 1.

超参数

当我们定义模型时,可以指定超参数。正如在此部分中看到的,最常见的超参数包括:

  • C:C 参数。
  • kernel:内核。最常见的内核为 'linear'、'poly' 和 'rbf'。
  • degree:如果内核是多项式,则此参数为内核中的最大单项式次数。
  • gamma:如果内核是径向基函数,则此参数为 γ 参数。

例如,下面我们定义了一个次数为4、C 参数为 0.1 的多项式内核模型。

>>> model = SVC(kernel='poly', degree=4, C=0.1)

支持向量机练习

在这道练习中,你将处理以下样本数据集,目标是定义一个准确率达到 100% 的模型。

你可以在以下练习的“data.csv”标签页中找到数据文件。它包含三列,前两列由数据点的坐标组成,第三列为标签。

我们将为你加载数据并将数据拆分为特征 X 和标签 y

你需要完成以下步骤:

1. 构建支持向量机模型 *使用 scikit-learn 的 SVC 创建支持向量机分类模型并将其赋值给变量 model

2. 将模型与数据进行拟合

  • 如果有必要的话,指定一些超参数。目标是在数据集中获得 100% 的准确率。 提示:并非所有内核都合适。

3. 使用模型进行预测

  • 预测训练集的标签,并将此列表赋值给变量 y_pred

4. 计算模型的准确率 *为此,使用 sklearn 函数 accuracy_score

点击测试答案 (Test Run)后,你将能够看到模型的边界区域,这些边界区域可以帮助你调整并获得正确的参数(如果需要的话)。

注意:这道练习要求在训练集上的准确率达到 100%。当然,要小心过拟合!如果参数选择非常大的值,你将很好地拟合训练集,但是可能并不是最好的模型。尝试寻找能够完成任务的最小可能参数,这样过拟合的几率就更小,虽然我们不会对此进行评分。

# Import statements 
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
import pandas as pd
import numpy as np

# Read the data.
data = np.asarray(pd.read_csv('data.csv', header=None))
# Assign the features to the variable X, and the labels to the variable y. 
X = data[:,0:2]
y = data[:,2]

# TODO: Create the model and assign it to the variable model.
# Find the right parameters for this model to achieve 100% accuracy on the dataset.
model = SVC(kernel='rbf', gamma=27)

# TODO: Fit the model.
model.fit(X,y)

# TODO: Make predictions. Store them in the variable y_pred.
y_pred = model.predict(X)

# TODO: Calculate the accuracy and assign it to the variable acc.
acc = accuracy_score(y, y_pred)

sklearn 中的 AdaBoost

在 sklearn 中建立 AdaBoost 模型与建立其他模型相同。你可以使用 scikit-learn 的 AdaBoost Classifier类。该类提供函数来定义你的模型,并将模型与数据进行拟合。

>>> from sklearn.ensemble import AdaBoostClassifier
>>> model = AdaBoostClassifier()
>>> model.fit(x_train, y_train)
>>> model.predict(x_test)

在上面的例子中,model 变量是一个决策树模型,它与数据 x_values 和 y_values 进行拟合。函数 fit和 predict 的功能与之前相同。

超参数

当我们定义模型时,我们可以确定超参数。在实际操作中,最常见的超参数为:

  • base_estimator: 弱学习器使用的模型(切勿忘记导入该模型)。
  • n_estimators: 使用的弱学习器的最大数量。

比如在下面的例子中,我们定义了一个模型,它使用 max_depth 为 2 的决策树作为弱学习器,并且它允许的弱学习器的最大数量为 4。

>>> from sklearn.tree import DecisionTreeClassifier
>>> model = AdaBoostClassifier(base_estimator = DecisionTreeClassifier(max_depth=2), n_estimators = 4)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西瓜情怀总是籽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值