实现一个简单的机器学习分类器:从数据预处理到模型评估

03-01 34阅读
󦘖

免费快速起号(微信号)

coolyzf

添加微信

概述

机器学习是人工智能领域的一个重要分支,它通过构建和训练模型来让计算机能够自动地进行预测或决策。本文将介绍如何使用Python编程语言实现一个简单的机器学习分类器,涵盖从数据预处理、特征工程、模型选择、训练到评估的完整流程。我们将使用著名的Iris数据集作为示例,并采用K近邻(K-Nearest Neighbors, KNN)算法进行分类。

环境搭建

在开始之前,我们需要确保已经安装了必要的库。你可以使用以下命令安装所需的库:

pip install numpy pandas scikit-learn matplotlib seaborn

这些库分别是:

numpy:用于数值计算。pandas:用于数据处理和分析。scikit-learn:用于机器学习建模。matplotlibseaborn:用于数据可视化。

数据加载与探索

首先,我们加载Iris数据集并进行初步探索。Iris数据集是一个经典的数据集,包含150个样本,分为3个类别,每个类别有50个样本。每个样本有4个特征:萼片长度、萼片宽度、花瓣长度和花瓣宽度。

import pandas as pdfrom sklearn.datasets import load_iris# 加载数据集iris = load_iris()data = pd.DataFrame(data= np.c_[iris['data'], iris['target']],                     columns= iris['feature_names'] + ['target'])# 查看前几行数据print(data.head())# 查看数据的基本信息print(data.info())# 查看目标变量的分布情况print(data['target'].value_counts())

输出结果如下:

   sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)  target0               5.1              3.5               1.4              0.2     0.01               4.9              3.0               1.4              0.2     0.02               4.7              3.2               1.3              0.2     0.03               4.6              3.1               1.5              0.2     0.04               5.0              3.6               1.4              0.2     0.0<class 'pandas.core.frame.DataFrame'>RangeIndex: 150 entries, 0 to 149Data columns (total 5 columns): #   Column                Non-Null Count  Dtype  ---  ------                --------------  -----   0   sepal length (cm)     150 non-null    float64 1   sepal width (cm)      150 non-null    float64 2   petal length (cm)     150 non-null    float64 3   petal width (cm)      150 non-null    float64 4   target                150 non-null    float64dtypes: float64(5)memory usage: 6.0 KBNone0.0    501.0    502.0    50Name: target, dtype: int64

从输出可以看到,数据集中没有缺失值,且目标变量target均匀分布在三个类别中。

数据可视化

为了更好地理解数据,我们可以绘制一些图表来观察特征之间的关系。

import seaborn as snsimport matplotlib.pyplot as plt# 绘制箱线图plt.figure(figsize=(10, 6))sns.boxplot(x="target", y="sepal length (cm)", data=data)plt.title('Sepal Length by Target')plt.show()# 绘制散点图矩阵sns.pairplot(data, hue="target")plt.show()

通过这些图表,我们可以直观地看到不同类别之间的特征差异,这有助于我们选择合适的特征进行建模。

数据预处理

在实际应用中,数据通常需要进行预处理才能用于机器学习模型。常见的预处理步骤包括标准化、归一化、编码等。对于Iris数据集,由于特征已经在合理的范围内,我们主要关注目标变量的编码。

from sklearn.preprocessing import StandardScalerfrom sklearn.model_selection import train_test_split# 分离特征和标签X = data.drop(columns=['target'])y = data['target']# 标准化特征scaler = StandardScaler()X_scaled = scaler.fit_transform(X)# 将数据集划分为训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)

模型选择与训练

接下来,我们选择K近邻(KNN)算法作为分类器,并对其进行训练。KNN是一种基于实例的学习算法,它通过计算新样本与训练集中样本的距离来进行分类。

from sklearn.neighbors import KNeighborsClassifierfrom sklearn.metrics import accuracy_score, classification_report, confusion_matrix# 初始化KNN分类器knn = KNeighborsClassifier(n_neighbors=3)# 训练模型knn.fit(X_train, y_train)# 预测测试集y_pred = knn.predict(X_test)# 计算准确率accuracy = accuracy_score(y_test, y_pred)print(f'Accuracy: {accuracy:.2f}')# 打印分类报告print(classification_report(y_test, y_pred))# 绘制混淆矩阵conf_matrix = confusion_matrix(y_test, y_pred)sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues')plt.xlabel('Predicted')plt.ylabel('True')plt.title('Confusion Matrix')plt.show()

输出结果如下:

Accuracy: 1.00              precision    recall  f1-score   support           0       1.00      1.00      1.00        10           1       1.00      1.00      1.00         8           2       1.00      1.00      1.00        12    accuracy                           1.00        30   macro avg       1.00      1.00      1.00        30weighted avg       1.00      1.00      1.00        30

从结果可以看出,KNN模型在测试集上的表现非常好,准确率达到100%。同时,分类报告中的其他指标也表明模型具有良好的性能。

模型优化

尽管KNN模型在当前设置下表现良好,但我们可以尝试调整参数以进一步优化模型。例如,改变邻居数量n_neighbors,或者使用交叉验证来选择最佳参数。

from sklearn.model_selection import cross_val_score# 使用交叉验证选择最佳的n_neighborsscores = []for k in range(1, 21):    knn = KNeighborsClassifier(n_neighbors=k)    score = cross_val_score(knn, X_scaled, y, cv=5).mean()    scores.append(score)# 绘制分数曲线plt.plot(range(1, 21), scores)plt.xlabel('Number of Neighbors')plt.ylabel('Cross-Validation Score')plt.title('Cross-Validation Score vs Number of Neighbors')plt.show()# 选择最佳的n_neighborsbest_k = scores.index(max(scores)) + 1print(f'Best number of neighbors: {best_k}')

通过交叉验证,我们可以找到最优的邻居数量,从而提高模型的泛化能力。

总结

本文详细介绍了如何使用Python实现一个简单的机器学习分类器。我们从数据加载与探索开始,逐步进行了数据预处理、模型选择与训练,并最终对模型进行了评估和优化。通过这个过程,读者可以掌握机器学习建模的基本步骤,并为更复杂的应用打下坚实的基础。

在未来的工作中,我们可以尝试更多的机器学习算法,如支持向量机(SVM)、随机森林(Random Forest)等,进一步提升模型的性能。此外,还可以探索深度学习技术,应用于更大规模和更复杂的数据集。

免责声明:本文来自网站作者,不代表ixcun的观点和立场,本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。客服邮箱:aviv@vne.cc
您是本站第1527名访客 今日有43篇新文章

微信号复制成功

打开微信,点击右上角"+"号,添加朋友,粘贴微信号,搜索即可!