一、
实验目的
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.
模型训练效果不佳:遇到模型训练效果不佳的情况,是由于数据
质量不佳、特征选择不合适或模型参数调整不当等原因导致的。针对
模型训练效果不佳的问题,可以尝试优化数据预处理步骤、调整模型
参数或使用其他更复杂的模型进行训练以提高模型的性能。
此次试验让我明白了,在编写代码之前,务必仔细检查文件路径和
文件名,确保它们是正确的。在处理数据时,要格外注意数据的质量
和完整性,以避免在后续的分析和建模过程中出现问题。对于模型训
练效果不佳的情况,需要耐心和细心地调整模型参数、优化数据预处
理步骤,并且不断尝试不同的方法,直到找到合适的解决方案。