HDU杭电--机器学习实验报告(三)

一、 实验目的
1 、监督学习之分类学习的算法流程
2 、从特征文件和标签文件中将所有数据加载到内存中,进行简单
的数据预处理。
3 、创建对应的分类器,并使用训练数据进行训练。
4 、利用测试集预测,通过使用真实值和预测值的比对,计算模型
整体的准确率和召回率,来评测模型。
二、 实验内容与要求
根据监督方式划分分类算法,分类学习问题可分为三大类:有监
督分类、半监督分类和无监督分类。
有监督分类是指用来训练分类器的所有样本都经过了人工或其他
方式的标注,有很多著名的分类器算法都属于有监督的学习方式,如
AdaBoost SVM ,神经网络算法以及感知器算法。
无监督分类是指所有的样本均没有经过标注,分类算法需利用样
本自身信息完成分类学习任务,这种方法通常被称为聚类,常用的聚
类算法包括期望最大化( EM )算法和模糊 C 均值聚类算法等。
半监督分类指仅有一部分训练样本(极少量)具有类标号,分类
算法需要同时利用有标号样本和无标号样本学习分类,使用两种样本
训练的结果比仅使用有标注的样本训练的效果更好。这类算法通常由
有监督学习算法改进而成,如 SemiBoost 、流形正则化、半监督 SVM
等。
分类问题应用非常广泛。通常是建立在回归之上,分类的最后一
层通常要使用 softmax 函数进行判断其所属类别。分类并没有逼近的概
念,最终正确结果只有一个,错误的就是错误的,不会有相近的概念。
分类学习:
•算法流程
•需要从特征文件和标签文件中将所有数据加载到内存中,由于存
在缺失值,此步骤还需要进行简单的数据预处理。
•创建对应的分类器,并使用训练数据进行训练。
•利用测试集预测,通过使用真实值和预测值的比对,计算模型
整体的准确率和召回率,来评测模型。
准确率 =(TP+TN)/(TP+TN+FP+FN)
精准率 =TP/(TP+FP)
召回率 =TP/(TP+FN) F1=(2 ×精确率×召回率 )/ (精确率 + 召回率)
灵敏度( Sensitivity = TP/(TP+FN)
特异度( Specificity = TN/(FP+TN)
真正率( TPR = 灵敏度 = TP/(TP+FN)
假正率( FPR = 1 - 特异度 = FP/(FP+TN)
三、 实验程序与结果
import numpy as np
import pandas as pd
from sklearn.impute import SimpleImputer
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import classification_report
import zipfile
import os
# 导入 numpy 库和 pandas
import numpy as np
import pandas as pd
# sklearn 库中导入预处理模块 Imputer
from sklearn.impute import SimpleImputer
# sklearn 库中依次导入三个分类器模块::
# K 近邻分类器 KNeighborsClassifier
# 决策树分类器 DecisionTreeClassifier
# 高斯朴素贝叶函 数 GaussianNB
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import GaussianNB
# 编写数据导入函数, 设置传两个参分别是特征文件的列表 feature_paths 和标签 文件 的列表
label_paths
# 定义 feature 数组变量,列数量和特征维度一致为 41
# 定义空的标签变量,列数与定义空的标签维度一致为 1
def load_datasets (feature_paths, label_paths):
feature = np.empty(( 0 , 41 )) # 初始化特征数组
label = np.empty(( 0 , 1 )) # 初始化标签数组
# 检查文件夹中是否存在六个 zip 文件
zip_files = [ 'A.zip' , 'B.zip' , 'C.zip' , 'D.zip' , 'E.zip' , 'XYZ.zip' ]
if set (os.listdir( './dataset/' )) != set (zip_files):
print ( "Error: dataset folder does not contain all required zip files." ) return None , None
# 加载特征数据
for file in feature_paths:
with zipfile.ZipFile(file, 'r' ) as zip_ref:
zip_ref.extractall( './dataset/' ) # 解压缩文件到指定目录
file_list = zip_ref.namelist() # 获取 zip 文件中的文件列表
feature_file = [f for f in file_list if f.endswith( '.csv' )][ 0 ] # 获取 csv 文件
# 读取特征数据并进行简单的数据预处理
data = pd.read_csv(os.path.join( './dataset/' , feature_file), header = None )
imp = SimpleImputer( strategy = 'mean' ) # 使用平均值进行缺失值填充
data_cleaned = imp.fit_transform(data)
feature = np.vstack([feature, data_cleaned])
# 加载标签数据
for file in label_paths:
with zipfile.ZipFile(file, 'r' ) as zip_ref:
zip_ref.extractall( './dataset/' ) # 解压缩文件到指定目录
file_list = zip_ref.namelist() # 获取 zip 文件中的文件列表
label_file = [f for f in file_list if f.endswith( '.csv' )][ 0 ] # 获取 csv 文件
# 读取标签数据
data = pd.read_csv(os.path.join( './dataset/' , label_file), header = None )
label = np.vstack([label, data])
# 返回加载后的特征和标签数据
return feature, label
if __name__ == '__main__' :
''' 设置数据路径 feature_paths label_paths '''
feature_paths = [ "./dataset/A.zip" , "./dataset/B.zip" ,
"./dataset/C.zip" , "./dataset/D.zip" ]
label_paths = [ "./dataset/E.zip" , "./dataset/XYZ.zip" ]
# 读入数据
# 使用 python 的分片方法,将数据路径中的前 4 个值作为训练集,并作为参数传入
load_dataset() 函数中,得到训练集合的特征 x_train ,训练集的标签 y_train
x_train, y_train = load_datasets(feature_paths[: 4 ], label_paths)
# 将最后一个值对应的数据作为测试集,送入 load_dataset() 函数中,得到测试集合的特征
x_test ,测试集的标签 y_test
x_test, y_test = load_datasets([feature_paths[- 1 ]], label_paths)
if x_train is None or x_test is None :
exit ( 1 )
# 使用 train_test_split() 函数,通过设置测试集比例 test_size 0 ,将数据随机打乱,便于后续
分类器的初始化和训练。
# 不采用 train_test_split ,而是手动切分数据集,因为要将所有数据加载到内存中 # 创建并训练 K 近邻分类器
# 使用测试集 x_test ,进行分类器预测,得到分类结果 answer_knn
answer_knn = knn.predict(x_test)
print ( 'Prediction done' )
# 使用决策树分类器
decision_tree = DecisionTreeClassifier()
decision_tree.fit(x_train, y_train)
# 使用测试集进行预测
answer_decision_tree = decision_tree.predict(x_test)
# 使用高斯朴素贝叶斯分类器
gaussian_nb = GaussianNB()
gaussian_nb.fit(x_train, y_train)
# 使用测试集进行预测
answer_gaussian_nb = gaussian_nb.predict(x_test)
# 使用 classification_report 函数对分类结果,
# 从精确率 precision 、召回率 recall f1 f1-score 和支持度 support 四个维度进行衡量
print ( "K 近邻分类器报告 :" )
print (classification_report(y_test, answer_knn))
print ( " 决策树分类器报告 :" )
print (classification_report(y_test, answer_decision_tree))
print ( " 高斯朴素贝叶斯分类器报告 :" )
print (classification_report(y_test, answer_gaussian_nb))
四、实验结果分析
该程序功能:
1. 从提供的 zip 文件中解压特征数据和标签数据。
2. 对特征数据进行均值填充处理。
3. 将数据分割为训练集和测试集。
4. 使用 K 近邻、决策树和朴素贝叶斯分类器对训练集进行训练。
5. 使用训练好的模型对测试集进行预测。
6. 输出每个分类器的性能评估报告(包括精确率、召回率、 F1
等指标)。
最终结果包括三个分类器的性能评估报告,用于评估各个分类器在
测试集上的表现。
五、实验问题解答与体会
1. 文件路径错误: 在程序中指定了特征数据和标签数据的文件路 径,但是由于文件路径错误或文件不存在导致了 `FileNotFoundError`
这可能是由于文件路径输入错误或文件确实不存在所致。
2. 特征数据和标签数据不匹配: * 在解压并加载特征数据和标签数
据时,需要确保它们是相匹配的。否则,训练模型时可能会出现错误。
在加载数据时,需要确保特征数据和标签数据相匹配,并采取相应的
处理方法。
3. 模型训练效果不佳:遇到模型训练效果不佳的情况,是由于数据
质量不佳、特征选择不合适或模型参数调整不当等原因导致的。针对
模型训练效果不佳的问题,可以尝试优化数据预处理步骤、调整模型
参数或使用其他更复杂的模型进行训练以提高模型的性能。
此次试验让我明白了,在编写代码之前,务必仔细检查文件路径和
文件名,确保它们是正确的。在处理数据时,要格外注意数据的质量
和完整性,以避免在后续的分析和建模过程中出现问题。对于模型训
练效果不佳的情况,需要耐心和细心地调整模型参数、优化数据预处
理步骤,并且不断尝试不同的方法,直到找到合适的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值