三、算法步骤、代码、及结果

   1. 算法伪代码

功能: 创建或读取Iris数据集  

输入: 无  

输出: DataFrame (包含Iris数据集)  

开始  

    尝试  

         "iris.csv" 文件中读取数据到 df  

        打印 "从本地读取iris数据集成功"  

        打印 df 的前几行  

    异常处理 FileNotFoundError  

        打印 "本地iris.csv文件未找到,开始创建..."  

        调用 create_iris_dataset()  

        从新创建的 "iris.csv" 文件中读取数据到 df  

        打印 "创建并从本地读取iris数据集成功"  

        打印 df 的前几行  

    结束尝试  

结束  

 

功能: 创建Iris数据集 CSV 文件  

输入: 无  

输出: 无  

开始  

    定义列名 = ['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm', 'Species']  

    定义样本数据 data  

    创建 DataFrame df 使用列名和样本数据  

     df 保存为 "iris.csv"  

    打印 "iris数据集CSV文件已创建。"  

结束  

 

功能: 主处理逻辑  

输入: 无  

输出: 模型评估指标  

开始  

     scikit-learn 加载 Iris 数据集  

    赋值 X, y 为加载的数据和标签  

    打印 "scikit-learn加载iris数据集成功"  

    打印 X.shape y.shape  

 

    初始化随机森林分类器 rf_classifier  

    初始化 KFold 交叉验证器 kf (5折,洗牌)  

 

    初始化列表 accuracies, precisions, recalls, f1s 为空  

 

    对于每个 (train_index, test_index) kf.split(X) 中  

        定义 X_train = X[train_index]  

        定义 X_test = X[test_index]  

        定义 y_train = y[train_index]  

        定义 y_test = y[test_index]  

 

        训练 rf_classifier 使用 X_train y_train  

        预测 y_pred 使用 X_test  

 

        计算并添加准确度到 accuracies  

        计算并添加精度到 precisions  

        计算并添加召回率到 recalls  

        计算并添加 F1 值到 f1s  

    结束循环  

 

    打印平均准确度: 计算 accuracies 的均值  

    打印平均精度: 计算 precisions 的均值  

    打印平均召回率: 计算 recalls 的均值  

    打印平均F1: 计算 f1s 的均值  

结束

   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)

 

    # 保存DataFrameCSV文件

    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)调用库方法

# 导入所需的库

import pandas as pd

from sklearn.datasets import load_iris

# scikit-learn 库中加载 iris 数据集

iris = load_iris()

X, y = iris.data, iris.target

# 将数据转换为 DataFrame

iris_df = pd.DataFrame(X, columns=iris.feature_names)

iris_df['target'] = y

# 划分数据集为训练集和测试集

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 自己编写的决策树分类器算法

class DecisionTreeClassifier:

    def __init__(self):

        self.tree = None

    def fit(self, X, y):

        # 这里只是一个占位符,实际的决策树构建代码会更复杂

        self.tree = "决策树模型"

    def predict(self, X):

        # 这里只是一个占位符,实际的预测代码会更复杂

        return [0] * len(X)  # 假设所有预测结果都是类别0

# 初始化分类器

dt_classifier = DecisionTreeClassifier()

# 训练模型

dt_classifier.fit(X_train, y_train)

# 使用训练好的模型进行预测

y_pred = dt_classifier.predict(X_test)

# 计算并打印模型的准确度

from sklearn.metrics import accuracy_score

accuracy = accuracy_score(y_test, y_pred)

print(f"\n准确度: {accuracy:.4f}")

   3. 结果截图(包括:准确率;精度、召回率、F1

1)准确率:***

 

2)精度:***,召回率:***F1***

 

 

四、心得体会

通过本次实验,我熟悉了 Python 的基本操作,掌握了使用 pandas 读取数据集及模型性能评估。实验中实现了五折交叉验证,加深了对训练集、测试集和评估标准(准确度、精度、召回率和 F1 值)的理解。使用随机森林分类器提高了我对机器学习模型的认识。这次实践让我认识到理论与实际结合的重要性,还学会了查阅资料解决问题的技能。

posted on 2025-01-06 15:21    阅读(12)  评论(0)    收藏  举报