序言
抽查是一种发现哪种算法在机器学习问题中表现良好的方法。我们无法提前知道哪种算法最适合。我们必须尝试多种方法,并关注那些表现出最大潜力的方法。通过本文后,我们将知道:
1. 如何抽查机器学习算法的分类问题。
2. 如何抽查两种线性分类算法。
3. 如何抽查四种非线性分类算法。
算法抽样检测
我们无法提前知道哪种算法最适合于数据集。必须使用试错法来发现一系列在具体问题上表现良好的算法,然后可以进一步深入研究和调整这些算法。我们将这个过程称为抽样检测,即抽查。
问题不是:应该在数据集上使用什么算法?而是应该在数据集上抽样检测哪些算法?
我们可以在算法可能表现良好的数据集上进行猜测,这可以作为一个良好的起点。建议尝试结合多种算法,看看哪种算法能够在数据中找出结构。以下是当在数据集上抽样检测算法时的一些建议:
-
尝试结合不同算法的表示形式(例如,实例和树)
-
尝试结合不同的学习算法(例如,学习相同类型表示的不同算法)
-
尝试结合不同建模类型(例如,线性和非线性函数,参数化和非参数化)
算法概览
我们将要查看六种可以将其抽样检测到数据集上的分类算法。从两种线性机器学习算法开始:
-
逻辑回归(Logistic Regression)
-
线性判别分析(Linear Discriminant Analysis)
然后将查看四种非线性机器学习算法:
-
K-近邻(k-Nearest Neighbors, KNN)
-
朴素贝叶斯(Naive Bayes)
-
分类和回归树(Classification and Regression Trees, CART)
-
支持向量机(Support Vector Machines, SVM)
线性机器学习算法
将展示如何使用两种线性机器学习算法:逻辑回归和线性判别分析。
-
逻辑回归:逻辑回归假设数值输入变量服从高斯分布,并且可以用于建模二分类问题。我们就可以使用LogisticRegression类构建逻辑回归模型。
-
线性判别分析:线性判别分析(Linear Discriminant Analysis,简称LDA)是一种统计学方法,用于二分类和多分类问题。它也假设数值输入变量服从高斯分布。我们就可以使用LinearDiscriminantAnalysis类构建LDA模型。
非线性机器学习算法
我们将展示如何使用四种非线性机器学习算法。
-
K-最近邻(k-Nearest Neighbors,简称KNN):k-最近邻算法(KNN)使用距离度量来寻找训练数据中与新实例最相似的k个实例,并将这些邻居的输出平均值作为预测。您可以使用KNeighborsClassifier类构建KNN模型。
-
朴素贝叶斯(Naive Bayes):朴素贝叶斯算法通过计算每个类别的概率以及给定每个输入值时每个类别的条件概率来工作。这些概率对新数据进行估计,并相互乘积,假设它们都是独立的(这是一个简单或天真的假设)。当处理实值数据时,假设高斯分布可以轻松估计输入变量的概率,使用高斯概率密度函数。我们可以使用GaussianNB类构建朴素贝叶斯模型。
-
分类与回归树(Classification and Regression Trees,简称CART或决策树):分类与回归树(CART)算法从训练数据中构建二叉树。分割点通过评估训练数据中每个属性和每个属性的每个值来贪心地选择,以最小化一个成本函数(如基尼指数)。我们可以使用DecisionTreeClassifier类构建CART模型。
-
支持向量机(Support Vector Machines,简称SVM):支持向量机(SVM)寻找最佳分离两个类别的直线。那些最接近最佳分离类别的直线的数据实例被称为支持向量,并且影响直线的位置。SVM已经扩展到支持多个类别。特别是通过核函数参数使用不同核函数的重要性。默认使用强大的径向基函数(Radial Basis Function)。我们可以使用SVC类构建SVM模型。
案例源码分享
# coding: utf-8
"""
该脚本演示了使用六种不同的分类算法在数据集上进行分类的效果。这些算法包括两种线性方法:
(1)逻辑回归(Logistic Regression)
(2)线性判别分析(Linear Discriminant Analysis)
以及四种非线性方法:
(1)K-近邻(k-Nearest Neighbors, KNN)
(2)朴素贝叶斯(Naive Bayes)
(3)分类和回归树(Classification and Regression Trees, CART)
(4)支持向量机(Support Vector Machines, SVM)
"""
# 导入必要的库
from pathlib import Path # 用于处理文件路径
import pandas as pd # 用于数据处理
from sklearn.model_selection import KFold, cross_val_score # 用于交叉验证
from sklearn.linear_model import LogisticRegression # 逻辑回归模型
from sklearn.preprocessing import StandardScaler # 用于数据标准化
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis # 线性判别分析模型
from sklearn.neighbors import KNeighborsClassifier # KNN模型
from sklearn.naive_bayes import GaussianNB # 朴素贝叶斯模型
from sklearn.tree import DecisionTreeClassifier # 决策树模型
from sklearn.svm import SVC # 支持向量机模型
# 读取数据文件并对列名进行修改
filename = Path(__file__).parent / 'data/pima-indians-diabetes.csv'
data = pd.read_csv(filename)
column_names = {'Pregnancies': 'pregnant_times',
'Glucose': 'glucose',
'BloodPressure': 'blood_pressure',
'SkinThickness': 'skin_thickness',
'Insulin': 'insulin',
'BMI': 'BMI',
'DiabetesPedigreeFunction': 'DPF',
'Age': 'age',
'Outcome': 'outcome'}
data.rename(columns=column_names, inplace=True)
# 删除含有缺失值的行
data.dropna(inplace=True)
# 对特征数据进行标准化处理
scaler = StandardScaler()
X = scaler.fit_transform(data.iloc[:, :-1])
# 提取目标变量
Y = data.iloc[:, -1]
print(X.shape, Y.shape)
###### 逻辑回归(Logistic Regression)######
# 该代码块旨在使用交叉验证评估逻辑回归模型的性能。
# 打印逻辑回归的标题
print("\n\033[1;30m逻辑回归(Logistic Regression):\033[0m")
# 设置交叉验证的参数
# num_folds: 交叉验证的折数,这里设置为10
# random_state: 用于确保结果的可复现性
# shuffle: 是否在分割数据集前进行洗牌
num_folds = 10
kfold = KFold(n_splits=num_folds, random_state=7, shuffle=True)
# 创建逻辑回归模型实例
model = LogisticRegression()
# 进行交叉验证并存储结果
# cross_val_score函数将数据集X和Y分为num_folds折,并对模型进行训练和评估
results = cross_val_score(model, X, Y, cv=kfold)
# 打印交叉验证结果的平均值
# 该值代表了逻辑回归模型在多次交叉验证中的平均表现
print(results.mean())
###### 线性判别分析(Linear Discriminant Analysis)######
# 此代码块执行线性判别分析(LDA)。LDA是一种统计方法,用于将数据集划分为多个类别,并找到这些类别的线性判别特征。
print("\n\033[1;30m线性判别分析(Linear Discriminant Analysis):\033[0m")
# 使用K-Fold交叉验证来评估模型性能。K-Fold将数据集分成num_folds个部分(fold),依次使用每个部分作为测试集,其余部分作为训练集。
kfold = KFold(n_splits=num_folds, random_state=7, shuffle=True)
# 创建线性判别分析模型。
model = LinearDiscriminantAnalysis()
# 使用交叉验证来评估模型。cross_val_score将数据集X和标签Y传递给模型,并根据kfold的划分方式计算模型的平均得分。
results = cross_val_score(model, X, Y, cv=kfold)
# 打印模型的平均得分。
print(results.mean())
###### k-近邻(k-Nearest Neighbors, KNN)######
# 在这里,我们使用k-近邻算法(KNN)进行机器学习任务。
# k-近邻是一种监督学习算法,用于分类或回归问题。
# 该段代码主要步骤如下:
# 1. 初始化KNN模型。
# 2. 使用交叉验证来评估模型性能。
# 3. 打印模型的平均性能分数。
print("\n\033[1;30mk-近邻(k-Nearest Neighbors, KNN):\033[0m")
# 划分数据集为num_folds个折叠,每个折叠用于一次训练和一次测试。
kfold = KFold(n_splits=num_folds, random_state=7, shuffle=True)
# 创建KNeighborsClassifier实例,这是KNN算法的模型。
model = KNeighborsClassifier()
# 使用交叉验证来计算模型的得分。
results = cross_val_score(model, X, Y, cv=kfold)
# 打印KNN模型在交叉验证中的平均得分。
print(results.mean())
###### 朴素贝叶斯(Naive Bayes)######
# 在这里,我们使用朴素贝叶斯算法进行模型训练和验证。
# 该部分代码主要实现以下功能:
# 1. 利用K-Fold交叉验证方法对朴素贝叶斯模型进行评估。
# 2. 计算并输出模型在不同数据集上的平均得分。
print("\n\033[1;30m朴素贝叶斯(Naive Bayes):\033[0m") # 打印朴素贝叶斯模型的标题
# 划分数据集为训练集和测试集
# 使用K-Fold交叉验证,设置随机种子和是否打乱数据
kfold = KFold(n_splits=num_folds, random_state=7, shuffle=True)
# 实例化高斯朴素贝叶斯模型
model = GaussianNB()
# 使用交叉验证评估模型性能,返回每个折的得分
results = cross_val_score(model, X, Y, cv=kfold)
# 打印模型在所有折上的平均得分
print(results.mean())
###### 分类和回归树(Classification and Regression Trees, CART)######
# 这一部分代码用于展示使用CART(分类和回归树)算法进行模型训练和交叉验证的过程。
# num_folds: 指定交叉验证的折数。
print("\n\033[1;30m分类和回归树(Classification and Regression Trees, CART):\033[0m")
# 划分数据集为k个折,并打乱数据顺序
kfold = KFold(n_splits=num_folds, random_state=7, shuffle=True)
# 创建决策树分类器模型
model = DecisionTreeClassifier()
# 使用交叉验证评估模型性能,返回每个折的得分
results = cross_val_score(model, X, Y, cv=kfold)
# 打印交叉验证的平均得分
print(results.mean())
###### 支持向量机(Support Vector Machines, SVM)######
# 这一部分代码用于展示使用SVM(支持向量机)算法进行模型训练和交叉验证的过程。
print("\n\033[1;30m支持向量机(Support Vector Machines, SVM):\033[0m")
# 划分数据集为k个折,并打乱数据顺序
kfold = KFold(n_splits=num_folds, random_state=7, shuffle=True)
# 创建SVC模型(支持向量分类器)
model = SVC()
# 使用交叉验证评估模型性能,返回每个折的得分
results = cross_val_score(model, X, Y, cv=kfold)
# 打印交叉验证的平均得分
print(results.mean())
# 输出(略)