机器学习有监督算法

监督学习主要包括分类回归两种类型。

分类:分类是一种监督学习的任务,它的目标是将输入数据分到不同的类别中。常见的分类算法包括决策树、朴素贝叶斯、支持向量机、逻辑回归等。

回归:回归是一种监督学习的任务,它的目标是预测一个连续的数值输出。常见的回归算法包括线性回归、多项式回归、岭回归、Lasso回归等。

下面是一些常见的监督学习算法及其简要描述和示例代码展示:

1. 线性回归(Linear Regression)

用于建立输入特征和连续目标变量之间的线性关系。

 知识点:
     (1)损失函数:最小二乘法

最小二乘法通过最小化预测值与真实值之间的平方误差来优化模型,适用于线性回归问题;

误差方程为:

其最优解为:

其中X为m×n 的样本输入矩阵:

y为m×1 列向量,一般称为labels, 对应于简单函数,其实就是指函数值f(x)。

\omega为n×1 列向量,就是待求的拟和权重参数。


     (2)优化算法:梯度下降法

梯度下降法是一种常用的模型优化算法,通过计算损失函数关于模型参数的梯度来更新参数,从而达到最小化损失函数的目的。

示例代码如下:

 # 导入所需的库
import numpy as np
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

# 加载数据集
boston = load_boston()
X = boston.data
y = boston.target
# 将数据集拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建线性回归模型并拟合数据
model = LinearRegression()
model.fit(X_train, y_train)

# 预测测试集的房价
y_pred = model.predict(X_test)

# 计算模型的均方误差
mse = mean_squared_error(y_test, y_pred)
print("Mean squared error:", mse)

2. 逻辑回归(Logistic Regression)

 适用于二分类问题,通过将线性回归结果映射到[0, 1]区间进行分类。
 知识点:
     (1)损失函数:对数损失函数(逻辑损失函数)

对数损失函数通过最小化预测值与真实值之间的交叉熵来优化模型,适用于二分类和多分类问题。

对数损失函数的标准形式:

逻辑回归的 P(Y=y|x) 表达式如下:

将它带入到对数损失函数的标准形式,通过推导可以得到logistic的损失函数表达式如下:

     (2)优化算法:梯度下降法

梯度下降法是一种常用的模型优化算法,通过计算损失函数关于模型参数的梯度来更新参数,从而达到最小化损失函数的目的。

代码示例:

from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 加载鸢尾花数据集
iris = load_iris()

# 提取特征和标签
X = iris.data
y = iris.target

# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建逻辑回归模型
model = LogisticRegression()

# 训练模型
model.fit(X_train, y_train)

# 在测试集上进行预测
y_pred = model.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)

print("模型在测试集上的准确率为:", accuracy)

运行结果:

3. 决策树(Decision Tree)

通过树状结构进行分类或回归,通过一系列的分裂规则将数据划分为不同的类别或值。
知识点:
     (1)分裂准则:信息增益、基尼系数、均方误差等

决策树是一种用于分类或回归的常用机器学习算法,它通过构建一棵树来对数据进行分组。在构建决策树的过程中,需要使用分裂准则来选择最佳的分裂点。

信息增益(Information Gain):用于衡量特征对于分类任务的重要性。它表示一个特征对于分类任务的贡献有多大,即该特征的信息增益越大,则该特征对分类的影响越大。它是通过计算不同特征在当前样本集合中的信息熵(Entropy)与在该特征下子集的加权平均信息熵的差值来计算的。

基尼系数(Gini Index):用于衡量数据集不确定性的指标,与信息熵类似。基尼系数越小,说明数据集的纯度越高,即数据中更可能是同一类别的数据。它是通过计算各类别(即每个可能的输出)的基尼指数(Gini)的加权和来计算的,其中基尼指数表示从该类别中随机选择两个样本,它们不属于同一类别的概率。

均方误差(Mean Squared Error):用于衡量模型预测值与实际值之间误差的程度。它是将预测值与实际值的差值的平方求和,再除以样本数量来计算的。均方误差越小,说明模型预测效果越好。

     (2)剪枝策略:预剪枝、后剪枝

剪枝策略:决策树容易出现过拟合问题,为了避免过拟合,需要采用剪枝策略。

预剪枝是在构建决策树时,提前设置一个阈值,当节点分裂后的最小样本数小于阈值时停止分裂;

后剪枝是在决策树构建完成后,通过删除某些叶子节点或合并某些叶子节点来降低过拟合。

代码示例:

from sklearn.tree import DecisionTreeClassifier
     
     # 创建决策树分类器
     model = DecisionTreeClassifier()
     
     # 训练模型
     model.fit(X_train, y_train)
     
     # 预测
     y_pred = model.predict(X_test)

4. 支持向量机算法(Support Vector Machine, SVM)

SVM算法通过找到一个最优的超平面来进行分类,使得不同类别的样本之间的间隔最大化。
知识点:

1. 核函数:核函数是一种用于非线性分类和回归的技术,它能够将数据从原始空间中映射到高维特征空间中,使得在特征空间中线性不可分的问题在原始空间中成为了线性可分的问题。常见的核函数包括线性核、多项式核和径向基函数核等。

(1)线性核:将数据直接映射到同维的特征空间中,不进行任何转换,即 K(x,y)=x*y。特点是将数据映射到同一维度的特征空间中,效果较差,适用于数据本身线性可分的情况。
(2)多项式核:将数据映射到高维特征空间中,使用多项式函数进行非线性变换,即 K(x,y)=(x*y+1){\hat{}}d,其中 d 表示多项式的次数。它的特点是可以处理一些非线性可分的情况,但需要选择合适的多项式次数,否则会出现过拟合或欠拟合的问题。
(3)径向基函数核:将数据映射到无限维的特征空间中,通过高斯函数的形式进行非线性变换,即K(x,y)=exp(-||x-y|| \hat{}2 /2\sigma \hat{ } 2) ,其中 \sigma为控制函数衰减速度的参数。它的特点是可以将数据映射到无穷维的特征空间中,适用于处理复杂的非线性可分问题。但需要注意的是,径向基核函数对参数的选择比较敏感不当的参数选择可能会导致分类效果不佳。

2. 损失函数:损失函数是指模型在进行训练时评价模型预测结果与真实结果差异的函数。常见的损失函数包括合页损失函数、二次损失函数等。

(1)Hinge损失函数(SVM):广泛应用于 SVM 中,将分类问题看作是一个最大化边际的问题,即通过最小化错误分类的样本与分类决策边界之间的距离来实现分类。

线性支持向量机学习除了原始最优化问题,还有另外一种解释,就是最优化以下目标函数:


目标函数的第一项是经验损失或经验风险,函数


称为合页损失函数(hinge loss function)。下标”+”表示以下取正值的函数:


这就是说,当样本点(xi,yi)被正确分类且函数间隔(确信度)yi(w⋅xi+b)大于1时,损失是0,否则损失是1−yi(w⋅xi+b)。目标函数的第二项是系数为λ的w的L2范数,是正则化项。

示例代码如下:


from sklearn import datasets
import numpy as np
import matplotlib.pyplot as plt

iris = datasets.load_iris()
X = iris["data"][:, (2, 3)] # 花瓣长度和宽度
y = (iris["target"] == 2).astype(np.float64) # 二分类任务,Iris-Virginica分类为正例
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC

svm_clf = Pipeline([
        ("scaler", StandardScaler()),
        ("linear_svc", LinearSVC(C=1, loss="hinge", random_state=42))
    ])
svm_clf.fit(X, y)
plt.figure(figsize=(10, 5))
plt.plot(X[:, 0][y==0], X[:, 1][y==0], "bs", label="Iris-NonVirginica")
plt.plot(X[:, 0][y==1], X[:, 1][y==1], "g^", label="Iris-Virginica")

# 生成网格点坐标用于画出决策边界
x0s = np.linspace(2.5, 7, 200)
x1s = np.linspace(0.8, 2.7, 200)
x0, x1 = np.meshgrid(x0s, x1s)
X_new = np.c_[x0.ravel(), x1.ravel()]
y_predict = svm_clf.predict(X_new).reshape(x0.shape)
plt.contourf(x0, x1, y_predict, cmap=plt.cm.brg, alpha=0.2)

# 添加轴标签和标题
plt.xlabel("Petal length", fontsize=14)
plt.ylabel("Petal width", fontsize=14)
plt.title("SVM Decision Boundary", fontsize=16)

# 添加图例
plt.legend(fontsize=12, loc="upper left")

# 显示图像
plt.show()


运行结果:

5.朴素贝叶斯分类算法(Naive Bayes)

朴素贝叶斯分类算法是一种基于贝叶斯定理的分类算法,适用于分类问题中特征属性数目较多的情况。

(1)贝叶斯定理:P(A|B) = P(B|A) * P(A) / P(B),其中A和B分别表示事件,P(A|B)表示在B发生的情况下A发生的概率,P(B|A)表示在A发生的情况下B发生的概率,P(A)和P(B)分别表示A和B发生的概率。

(2)朴素贝叶斯分类算法的基本思想:根据贝叶斯定理,对于给定的输入样本,计算出它属于每个类别的概率,然后将概率最大的类别作为该样本的分类结果。

(3)先验概率和条件概率:在朴素贝叶斯分类算法中,先验概率指的是每个类别的概率,条件概率指的是每个类别中每个特征属性的概率,这些概率可以通过对训练数据进行统计来获得。

(4)拉普拉斯平滑:当某些特征属性在训练数据中没有出现时,其条件概率为0,这会导致整个模型的预测准确率降低。为了避免这种情况,通常使用拉普拉斯平滑对条件概率进行平滑处理。

(5)多项式模型和伯努利模型:朴素贝叶斯分类算法有两种常见的模型,即多项式模型和伯努利模型。多项式模型适用于特征属性的取值是离散的情况,伯努利模型适用于特征属性的取值是二值的情况。

(6) 后验概率和分类决策:对于每个输入样本,朴素贝叶斯分类算法计算出它属于每个类别的后验概率,然后将概率最大的类别作为该样本的分类结果。如果两个类别的后验概率相等,则需要使用其他方法进行分类决策。

示例代码如下:

import pandas as pd
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import CountVectorizer
data = pd.DataFrame({'Category': ['sports', 'tech', 'sports', 'tech', 'tech', 'sports'],
                     'Text': ['The team performed well in the match', 'New device has been launched',
                              'The fans were thrilled with the victory', 'The latest technology news',
                              'The gadget is packed with features', 'The tournament has begun']})
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(data['Text'])
y = data['Category']
nb_model = MultinomialNB().fit(X, y)
new_text = ['The team has a new coach']
new_text_vectorized = vectorizer.transform(new_text)
nb_model.predict(new_text_vectorized)

运行结果:

输出结果为 array(['sports'], dtype='<U6'),预测结果为 'sports',即该新文章被预测为体育类文章。

6. 随机森林(Random Forest)

随机森林:通过集成多个决策树进行分类或回归,通过投票或平均预测结果来做出最终决策。

知识点:决策树集成是一种将多个决策树模型组合来提高整体性能的技术。其中,装袋法(Bagging)和提升法(Boosting)是两种常用的集成方法。

装袋法是一种并行的集成方法,具体步骤如下:

1. 从训练集中随机抽取若干个样本,形成一个新的训练集。

2. 基于新的训练集构建一个决策树模型。

3. 重复步骤1和2,形成多个决策树模型。

4. 对于测试集中的每个样本,通过投票的方式进行预测。即,将每个模型的预测结果进行统计,选择出现次数最多的类别作为最终的预测结果。

提升法是一种串行的集成方法,具体步骤如下:

1. 基于原始训练集构建一个基本的决策树模型。

2. 对于训练集中分错的样本,增加它们的权重,训练出另一个决策树模型。

3. 循环重复步骤2,形成多个决策树模型。

4. 对于测试集中的每个样本,通过加权的方式进行预测。即,根据每个模型在训练集上的表现,为其分配一个权重,将每个模型的预测结果加权求和,得到最终的预测结果。

装袋法和提升法都可以通过决策树算法来构建基本模型,但它们的思想和实现方式略有不同。装袋法通过并行的方式构建多个模型,充分利用整个训练集的信息,从而降低过拟合的风险;而提升法通过串行的方式加强每个基本模型的预测能力,提高整体模型的泛化性能。

     (2) 随机性:随机选择样本和特征

代码示例:

  from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
import matplotlib.pyplot as plt

# 导入iris数据集
iris = load_iris()
X = iris.data
y = iris.target

# 分割数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 创建随机森林模型
rf = RandomForestClassifier(n_estimators=100, random_state=42)

# 拟合训练数据
rf.fit(X_train, y_train)

# 预测测试集
y_pred = rf.predict(X_test)

# 计算准确率
accuracy = rf.score(X_test, y_test)
print("Accuracy:", accuracy)

# 获取特征重要性
importances = rf.feature_importances_

# 将特征重要性可视化
plt.bar(range(X.shape[1]), importances)
plt.xticks(range(X.shape[1]), iris.feature_names, rotation=90)
plt.title("Feature Importances")
plt.show()

运行结果:

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值