完成机器学习实验,并完成大型数据库实验,以下为实验内容:
实验一:数据准备与模型评估
一、实验目的
熟悉 Python 的基本操作,掌握对数据集的读写实现、对模型性能的评估实现的能力;
加深对训练集、测试集、N 折交叉验证、模型评估标准的理解。
二、实验内容
(1)利用 pandas 库从本地读取 iris 数据集;
(2)从 scikit-learn 库中直接加载 iris 数据集;
(3)实现五折交叉验证进行模型训练;
(4)计算并输出模型的准确度、精度、召回率和 F1 值。
3、操作要点
(1)安装 Python 及 pycharm(一种 Python 开发 IDE),并熟悉 Python 基本操作;
(2)学习 pandas 库里存取文件的相关函数,以及 scikit-learn 库里数据集下载、交叉验
证、模型评估等相关操作;
(3)可能用的库有 pandas,scikit-learn,numpy 等,需要提前下载 pip;
(4)测试模型可使用随机森林 rf_classifier = RandomForestClassifier(n_estimators=100),
或其它分类器;
(5)撰写实验报告,提交源代码;实验报告在所有上机实验结束后提交。
三、算法步骤、代码、及结果
1. 算法伪代码
1. 导入必要的库
- 导入pandas库
- 导入numpy库
- 导入scikit-learn中的load_iris函数
- 导入KFold类
- 导入RandomForestClassifier类
- 导入准确率、精确度、召回率和F1分数计算函数
2. 定义函数create_iris_dataset()
- 创建iris数据集的列名
- 创建iris数据集的样本数据
- SepalLengthCm: 随机生成150个0到10之间的数
- SepalWidthCm: 随机生成150个0到5之间的数
- PetalLengthCm: 随机生成150个0到15之间的数
- PetalWidthCm: 随机生成150个0到10之间的数
- Species: 随机选择150个类别(Setosa, Versicolour, Virginica)
- 将数据转换为DataFrame
- 保存DataFrame为CSV文件('iris.csv')
- 打印“iris数据集CSV文件已创建。”
3. 检查'iris.csv'文件是否存在
- 尝试读取'iris.csv'文件
- 如果成功,打印“从本地读取iris数据集成功”,并显示前5行数据
- 如果文件未找到,调用create_iris_dataset()函数创建数据集
- 读取创建的'iris.csv'文件并打印成功信息和前5行数据
4. 从scikit-learn库中加载iris数据集
- 调用load_iris()函数,获取特征集X和标签集y
- 打印“从scikit-learn加载iris数据集成功”,并显示数据集形状
5. 实现五折交叉验证进行模型训练
- 创建RandomForestClassifier实例,设置n_estimators为100
- 创建KFold实例,设置n_splits为5,shuffle为True,random_state为42
- 初始化空列表:accuracies, precisions, recalls, f1s
6. 对于每一折的训练和测试索引
- 划分训练集X_train和测试集X_test
- 划分训练集y_train和测试集y_test
- 训练随机森林模型rf_classifier
- 预测测试集y_pred
- 计算并保存准确率、精确度、召回率和F1值到相应列表
7. 计算并输出模型的平均准确度、精度、召回率和F1值
- 打印平均准确度
- 打印平均精度
- 打印平均召回率
- 打印平均F1值
2. 算法主要代码
(1)完整源代码
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import KFold
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
# 步骤1:创建iris数据集CSV文件(如果需要)
def create_iris_dataset():
# 创建iris数据集的列名
columns = ['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm', 'Species']
# 创建iris数据集的样本数据
data = {
'SepalLengthCm': np.random.rand(150) * 10,
'SepalWidthCm': np.random.rand(150) * 5,
'PetalLengthCm': np.random.rand(150) * 15,
'PetalWidthCm': np.random.rand(150) * 10,
'Species': np.random.choice(['Setosa', 'Versicolour', 'Virginica'], 150)
}
# 将数据转换为DataFrame
df = pd.DataFrame(data, columns=columns)
# 保存DataFrame为CSV文件
df.to_csv('iris.csv', index=False)
print("iris数据集CSV文件已创建。")
# 检查iris.csv文件是否存在,如果不存在则创建
try:
df = pd.read_csv('iris.csv')
print("从本地读取iris数据集成功:")
print(df.head())
except FileNotFoundError:
print("本地iris.csv文件未找到,开始创建...")
create_iris_dataset()
df = pd.read_csv('iris.csv')
print("创建并从本地读取iris数据集成功:")
print(df.head())
# 步骤2:从scikit-learn库中直接加载iris数据集
iris = load_iris()
X, y = iris.data, iris.target
print("从scikit-learn加载iris数据集成功:")
print("数据集形状:", X.shape, y.shape)
# 步骤3:实现五折交叉验证进行模型训练
rf_classifier = RandomForestClassifier(n_estimators=100)
kf = KFold(n_splits=5, shuffle=True, random_state=42)
accuracies = []
precisions = []
recalls = []
f1s = []
for train_index, test_index in kf.split(X):
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]
# 训练模型
rf_classifier.fit(X_train, y_train)
y_pred = rf_classifier.predict(X_test)
# 评估模型
accuracies.append(accuracy_score(y_test, y_pred))
precisions.append(precision_score(y_test, y_pred, average='macro'))
recalls.append(recall_score(y_test, y_pred, average='macro'))
f1s.append(f1_score(y_test, y_pred, average='macro'))
# 步骤4:计算并输出模型的准确度、精度、召回率和F1值
print(f"平均准确度: {np.mean(accuracies)}")
print(f"平均精度: {np.mean(precisions)}")
print(f"平均召回率: {np.mean(recalls)}")
print(f"平均F1值: {np.mean(f1s)}")
(2)调用库方法
1. create_iris_dataset()
说明:创建iris数据集的CSV文件。
参数:无。
作用:生成一个包含150个样本的随机iris数据集,并保存为CSV文件。
2. pd.read_csv('iris.csv')
说明:从CSV文件中读取数据。
参数:
'iris.csv':要读取的CSV文件名。
作用:将CSV文件中的数据读取为Pandas DataFrame。
3. load_iris()
说明:从scikit-learn库中加载iris数据集。
参数:无。
作用:加载内置的iris数据集,返回数据集的特征和标签。
4. RandomForestClassifier(n_estimators=100)
说明:创建随机森林分类器实例。
参数:
n_estimators:森林中树的数量,默认为100。
作用:随机森林是一种集成学习方法,它通过构建多个决策树来进行分类或回归分析。
5. KFold(n_splits=5, shuffle=True, random_state=42)
说明:创建K折交叉验证的分割器。
参数:
n_splits:分割的份数,即K折交叉验证中的K,默认为5。
shuffle:是否在分割前对数据进行随机打乱,默认为True。
random_state:随机数生成器的种子,默认为None。设置相同的种子可以确保每次分割的结果相同。
作用:用于生成训练集和测试集的索引,以进行K折交叉验证。
6. accuracy_score(y_test, y_pred)
说明:计算准确率。
参数:
y_test:真实的标签。
y_pred:预测的标签。
作用:计算模型预测正确的样本占总样本的比例。
7. precision_score(y_test, y_pred, average='macro')
说明:计算精确度(查准率)。
参数:
y_test:真实的标签。
y_pred:预测的标签。
average:计算平均值的方法,默认为'binary'。其他选项包括'micro'、'macro'、'weighted'等。
作用:计算模型预测为正类中实际为正类的比例。
8. recall_score(y_test, y_pred, average='macro')
说明:计算召回率(查全率)。
参数:同precision_score。
作用:计算实际为正类中被模型预测为正类的比例。
9. f1_score(y_test, y_pred, average='macro')
说明:计算F1值。
参数:同precision_score。
3. 结果截图(包括:准确率;精度、召回率、F1)
(1)准确率:***
(2)精度:***,召回率:***,F1:***
四、心得体会
数据处理的重要性:在机器学习中,数据的准备和处理是至关重要的。通过创建CSV文件并读取数据,我们可以确保数据集的可用性和一致性。即使是随机生成的数据,合理的结构和格式也能帮助我们更好地进行后续分析。
模型选择与评估:随机森林是一种强大的集成学习方法,适用于分类和回归任务。通过使用K折交叉验证,我们可以更好地评估模型的性能,避免因数据划分而导致的评估偏差。交叉验证提供了对模型泛化能力的更可靠的估计。
总的来说,这段代码不仅展示了如何使用随机森林进行分类任务,还强调了数据处理、模型评估和性能指标的重要性。通过这些实践,我们能够更好地理解机器学习的基本概念和应用。
标签:iris,日报,print,score,test,csv,数据,12.18 From: https://www.cnblogs.com/lijianlongCode13/p/18671488