暑假实习|机器学习第不记得第几天了

今天做一个完整的机器学习过程,使用的是支持向量机(Support Vector Machine,SVM)算法的SVC类。SVM是一种监督学习算法,用于分类和回归任务。SVC类是Scikit-learn中用于实现支持向量机分类器的类。通过使用SVC类,可以创建一个支持向量机分类模型,并使用其提供的方法进行训练和预测。

实验步骤

  1. 导入数据,并对数据进行预处理,包括删除缺失值或者补齐空缺值,将数据设置为DateFrame()和将字符串型描述值转化为数值型变量等,下面也会提到。
  2. 对模型进行特征编码和特征放缩。特征编码的目的是将非数值型的目标变量转换为数值型,以便在机器学习模型中使用;特征缩放的目的是将不同特征的数值范围调整到相似的尺度,以便更好地进行模型训练和预测。
  3. 对特征和目标变量进行划分,并区分出训练集和测试集。原理是先用训练集数据训练,找出规律,再使用测试集进行测试,将预测结果与输出结果比较,得出预测的准确性。作者个人理解,特征就是自变量及与因变量之间的关系,目标变量就是因变量。通过训练集分析出自变量与因变量之间的关系,预测出因变量,再与真实的因变量比较,得出预测的准确性等一系列指标。
  4. 输出结果。

选择方法 

这里选择的是支持向量机,其适用范围如下:

  1. 二分类问题,SVM最初是为二分类问题设计的,可以有效地处理线性可分和线性不可分的数据集。
  2.  多分类问题,通过一对多(One-vs-Rest)或一对一(One-vs-One)的策略,SVM可以扩展到多类别分类问题。
  3.  非线性问题,通过使用核函数(如多项式核函数、高斯核函数等),SVM可以处理非线性可分的数据集,将数据映射到高维空间进行分类。
  4.  小样本数据集:SVM在小样本数据集上表现出色,因为它只使用支持向量来进行决策,而不依赖于整个数据集。
  5. 特征维度高的数据集:SVM在高维数据集上表现良好,因为它可以通过选择合适的核函数来处理高维特征空间。
  6. 异常值存在的数据集:SVM对异常值具有较好的鲁棒性,因为它主要关注支持向量,而不受其他样本的影响。

需要注意的是,SVM对于大规模数据集的训练和预测可能会比较耗时,因为它需要计算支持向量和决策边界。在这种情况下,可以考虑使用核函数的近似方法(如核近似、随机梯度下降等)来加速计算。

本次实验数据只有34个,属于小样本,可以使用。

本次实验部分数据如下:

 完整代码如下:

from sklearn.model_selection import train_test_split  # 将数据集划分为训练集和测试集
from sklearn.metrics import classification_report, confusion_matrix, precision_score, accuracy_score, \
    recall_score  # 评估分类模型的性能
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import LabelEncoder
from sklearn.svm import SVC
from sklearn.preprocessing import LabelEncoder  # 创建LabelEncoder对象

data = pd.read_excel(r'D:\桌面文件\SummerIntership\06.数据\data\susceptibility.xls')  # 数据清洗
data = data.dropna()  # 删除包含缺失值的行
selected_features = ['index', 'geologic structure', 'human activity', 'underground water']  # 特征选择
label_encoder = LabelEncoder()
columns_to_encode = ["geologic structure", "human activity", "underground water"]
for column in columns_to_encode:
    data[column] = label_encoder.fit_transform(data[column])  # 特征编码
scaler = StandardScaler()  # 特征缩放的目的是将不同特征的数值范围调整到相似的尺度,以便更好地进行模型训练和预测
data = data[selected_features]
data = scaler.fit_transform(data)
encoder = LabelEncoder()  # 特征编码的目的是将非数值型的目标变量转换为数值型,以便在机器学习模型中使用
susceptibility_column = data[:, -1]  # `labels`是目标变量(标签),包含了与特征数据对应的样本标签
y = encoder.fit_transform(susceptibility_column)  # 特征和目标变量划分
X = data[:, :-1]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
model = SVC()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)  # 进行模型评估和分析
print(y_pred)  # 输出预测准确率、精确率和召回率
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
print("预测准确率:", accuracy)
print("精确率:", precision)
print("召回率:", recall)  # 输出分类报告和混淆矩阵
classification_report = classification_report(y_test, y_pred)
confusion_matrix = confusion_matrix(y_test, y_pred)
print("分类报告:")
print(classification_report)
print("混淆矩阵:")
print(confusion_matrix)

输出结果如下:

输出结果解释:

根据给出的数据及代码,可以进行以下分析:

1. 特征编码:根据代码中的特征编码部分,可以看出"geologic structure"、"human activity"和"underground water"这三个特征列所对应的数据都被进行了编码。编码的目的是将非数值型的特征转换为数值型,以便在机器学习模型中使用。根据给出的数据,可以看到这三个特征的取值分别为"weak"和"strong"、"weak"和"strong"以及"rich"和"poor"。经过编码后,这些特征的取值被映射为0和1的数值。

2. 目标变量:根据给出的数据可以看到目标变量"suceptibility"的取值为"likely"和"unlikely"。经过编码后,"likely"被映射为1,"unlikely"被映射为0。

3. 模型训练和预测:根据代码中的训练集和测试集划分部分,数据被划分为训练集和测试集,并使用SVC模型进行训练和预测。根据给出的数据,可以看到训练集和测试集中的特征数据和目标变量都是经过编码的数值。模型训练完成后,使用测试集进行预测,得到了预测结果[1 1 1 1 1 1 0]。根据预测结果,可以初步分析模型的性能。预测结果中的每个数字代表一个样本的预测标签。根据目标变量的编码,0表示"unlikely",1表示"likely"。因此,预测结果中的0和1可以被解释为对应样本的预测类别。通过比较预测结果和真实标签,可以计算准确率、召回率等指标来评估模型的分类性能。 

具体如下:

  • 预测准确率(Accuracy):预测准确率为0.7142857142857143,表示模型在测试数据集上的预测准确率为71.43%。
  • 精确率(Precision):精确率为0.8333333333333334,表示模型在预测为正类的样本中,有83.33%的样本是真正的正类。
  •  召回率(Recall):召回率为0.8333333333333334,表示模型能够正确地识别出83.33%的真正正类样本。
  • 分类报告(Classification Report):分类报告提供了每个类别的精确率、召回率、f1-score和每个类别在测试数据集中的样本数量(support)。在这个例子中,类别0的精确率、召回率和f1-score都为0,表示模型无法正确地识别出类别0。类别1的精确率、召回率和f1-score都为0.83,表示模型在类别1上的预测效果较好。
  • 此外,每个类别在测试数据集中的样本数量(support)的取值为1、6分别对应了类别0和类别1的样本数量。即, 类别0的support为1,表示测试数据集中类别0的样本数量为1;类别1的support为6,表示测试数据集中类别1的样本数量为6。总样本数量为7,即类别0和类别1的样本数量之和(总数据为34个,测试集取百分之二十,总共7个)。
  • accuracy:表示模型在测试数据集上的准确率,即正确预测的样本数占总样本数的比例,在这个例子中,准确率为0.71,即71%的样本被正确预测;macro avg:表示对所有类别的指标进行平均得到的宏平均值,在这个例子中,精确率、召回率和f1-score的宏平均值都为0.42;weighted avg:表示对所有类别的指标进行加权平均得到的加权平均值,在这个例子中,精确率(precision)、召回率(recall)和f1-score的加权平均值都为0.71。这些指标可以帮助我们综合评估模型的整体性能,而不仅仅关注单个类别的表现。
  • 混淆矩阵(Confusion Matrix):混淆矩阵是一个2x2的矩阵,用于展示模型的预测结果与真实标签之间的关系。在这个例子中,混淆矩阵为[[0 1] [1 5]],表示模型将1个样本错误地预测为0,将5个样本正确地预测为1。
  • 综上所述,该模型在预测准确率、精确率和召回率上表现较好,但在类别0上的预测效果较差。

注:F1-score是一种综合评估模型性能的指标,常用于评估分类模型的准确性。它结合了模型的精确率(precision)和召回率(recall)两个指标。精确率是指模型预测为正例的样本中,实际为正例的比例。召回率是指实际为正例的样本中,被模型正确预测为正例的比例。F1-score是精确率和召回率的调和平均值,可以综合考虑模型的准确率和召回率。它的计算公式为:F1-score = 2 * (precision * recall) / (precision + recall)。F1-score的取值范围为0到1,值越接近1表示模型的性能越好。当精确率和召回率都很高时,F1-score也会较高,反之亦然。F1-score在不同类别的样本数量不平衡或者关注模型的错误分类情况时,比准确率更能反映模型的性能。 

 需要注意的是,每次输出的结果是不一样的,因为测试集总数虽然是20%,但是具体内容是不固定的。每次运行代码时,训练集和测试集的样本都会有所不同,导致模型训练和预测的结果也会不同。输出的结果代表了模型对测试集样本的预测结果,具有一定的“主观性”。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Ricardo_yanwu

发博客也就图一乐学到知识最重要

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

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

打赏作者

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

抵扣说明:

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

余额充值