10.12

实验一:数据准备与模型评估

一、实验目的

熟悉 Python 的基本操作,掌握对数据集的读写实现、对模型性能的评估实现的能力; 加深对训练集、测试集、N 折交叉验证、模型评估标准的理解。

 

二、实验内容

(1)利用 pandas 库从本地读取 iris 数据集; (2)从 scikit-learn 库中直接加载 iris 数据集; (3)实现折交叉验证进行模型训练; (4)计算并输出模型的准确度、精度、召回率和 F1 值。

 

 

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

   1. 算法伪代码

实验目的1:

1. 数据获取

2. 导入`pandas`库并命名为`pd`。

3. 使用`pandas`的`read_csv`函数从指定路径(`r"C:\Users\王士英\Desktop\iris.csv"`)读取CSV文件,设置`header`为`None`(表示文件没有列名),并自定义列名`['sepal length','sepal width', 'petal length','petal width','species']`,将读取的数据存储为`iris_data`。

4. 使用`pd.DataFrame`将`iris_data`转换为`DataFrame`格式并存储为`iris`。

5. 打印`iris`,即输出读取并处理后的数据集。

 

   2. 算法主要代码

(1)完整源代码

【自己写的算法代码,没有调已有的该算法的库】

实验目的1:

#数据获取
import pandas as pd

iris_data=pd.read_csv(r"C:\Users\王士英\Desktop\iris.csv",header=None,names=['sepal length','sepal width',
                    'petal length','petal width','species'])

iris=pd.DataFrame(iris_data)
print(iris)

 

 

import pandas as pd
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import precision_score, recall_score, f1_score

path = r"C:\Users\王士英\Desktop\iris.csv"
df = pd.read_csv(path)
print('数据量:', len(df))
print(df.head())
print('空值数量统计:')
print(df.isnull().sum())
print(df.describe())

label_index = {'Setosa': 0, 'Versicolor': 1, 'Virginica': 2}
df['Species'] = df['Species'].apply(lambda x: label_index[x])

X = df[['sepal.length', 'sepal.width', 'petal.length', 'petal.width']].values.tolist()
y = df['Species'].tolist()
pca = PCA(n_components=2)
pca_data = pca.fit_transform(X)
plt.scatter(pca_data[:, 0], pca_data[:, 1], c=y)
plt.show()

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, stratify=y, random_state=2024)
print('训练集数据量:', len(X_train))
print('测试集数据量:', len(X_test))
dt = DecisionTreeClassifier(criterion='gini', splitter='best', max_depth=5, class_weight='balanced', random_state=2024)
dt.fit(X_train, y_train)
y_pred = dt.predict(X_test)
print('Precision:', precision_score(y_test, y_pred, average='macro'))
print('Recall:', recall_score(y_test, y_pred, average='macro'))
print('F1:', f1_score(y_test, y_pred, average='macro'))

 

 

 

 

目的2:

import pandas  as pd
from sklearn import datasets
iris = datasets.load_iris()
df =pd.DataFrame(data =iris.data,columns = iris.feature_names)
df['class'] =iris.target
df['class'] =df['class'].map({0: iris.target_names[0], 1: iris.target_names[1], 2: iris.target_names[2]})
print(df.head(10))
#print(df.describe())

 

 

# iris数据集加载
from sklearn import datasets
iris = datasets.load_iris()
#展示数据
#print(iris.data)
#展示每列的属性名
print(iris.feature_names)
#展示输出目标结果以及结果的含义
print(iris.target)
print(iris.target_names)
#查看输入和输出数据类型
print(type(iris.data))
print(type(iris.target))
#确认行列维度
print(iris.data.shape)
print(iris.target.shape)

 

 

from sklearn import datasets
from sklearn.model_selection import cross_val_score, KFold, cross_val_predict
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

# iris数据集加载
iris = datasets.load_iris()

# 创建随机森林分类器(可根据需要更换为其他分类器)
rf_classifier = RandomForestClassifier(n_estimators=100)

# 定义五折交叉验证
kf = KFold(n_splits=5, shuffle=True, random_state=42)

# 进行五折交叉验证并获取模型得分
scores = cross_val_score(rf_classifier, iris.data, iris.target, cv=kf)

# 使用交叉验证预测结果
y_pred = cross_val_predict(rf_classifier, iris.data, iris.target, cv=kf)

# 计算准确度
accuracy = accuracy_score(iris.target, y_pred)
print("准确度:", accuracy)

# 计算精度
precision = precision_score(iris.target, y_pred, average='macro')
print("精度:", precision)

# 计算召回率
recall = recall_score(iris.target, y_pred, average='macro')
print("召回率:", recall)

# 计算F1值
f1 = f1_score(iris.target, y_pred, average='macro')
print("F1值:", f1)

 

(2)调用库方法

【调用已有的该算法的库的方法,要写明调库参数都有哪些、参数是什么、代表了什么、起什么作用等等】

1. `pandas`库

 `read_csv`函数

    参数:

      `path`:字符串类型,代表数据文件的路径,在代码中为`r"C:\Users\王士英\Desktop\iris.csv"`,用于指定要读取的CSV文件的位置。

    作用:从指定路径的CSV文件中读取数据,并将其转换为`pandas`的`DataFrame`格式,方便后续的数据处理和分析。

### 2. `sklearn.decomposition.PCA`类

 PCA`类初始化

    参数:

      `n_components`:整数类型,在代码中设置为`2`。它表示要将数据降维到的主成分数量。通过指定这个参数,PCA算法会将原始高维数据投影到低维空间(这里是二维),在保留数据主要特征的同时降低数据的维度,便于可视化和进一步处理。

 `fit_transform`方法

    参数:

      `X`:二维列表类型,是经过处理后的特征数据(在代码中是`df[['sepal.length','sepal.width', 'petal.length', 'petal.width']].values.tolist()`)。它包含了用于进行主成分分析的数据点。

    作用:首先使用训练数据`X`来拟合PCA模型(计算主成分等相关参数),然后将数据`X`转换到新的低维空间(这里是二维),返回降维后的结果`pca_data`。这个降维后的数据可以用于可视化(如代码中的散点图绘制)或其他后续处理。

 3. `sklearn.model_selection.train_test_split`函数

 参数:

     `X`:二维列表类型,是特征数据(同PCA中的`X`),用于将其划分为训练集和测试集的特征部分。

    `y`:一维列表类型,是目标数据(在代码中是`df['Species'].tolist()`),用于将其照与`X`相同的划分方式划分为训练集和测试集的目标部分。

    `test_size`:浮点数类型,在代码中设置为`0.3`。它表示测试集在整个数据集(训练集 + 测试集)中所占的比例。例如,`0.3`表示将数据集的30%作为测试集,70%作为训练集。

     `stratify`:一维列表类型,为`y`。这个参数用于在划分数据集时保持各类别样本在训练集和测试集中的比例与原始数据集中的比例相同。这样可以避免在某些类别样本较少的情况下,测试集中没有该类别的样本,从而使模型在测试集上的评估更具代表性。

     `random_state`:整数类型,在代码中设置为`2024`。它是一个随机种子,用于确保每次运行代码时数据集的划分结果相同。如果不设置这个参数,每次运行`train_test_split`函数时都会得到不同的划分结果,这对于代码的调试和结果的可重复性是不利的。

 作用:将数据集按照指定的比例和方式划分为训练集和测试集,返回四个结果:`X_train`(训练集特征)、`X_test`(测试集特征)、`y_train`(训练集目标)和`y_test`(测试集目标)。这些划分后的数据集将用于模型的训练和评估。

### 4. `sklearn.tree.DecisionTreeClassifier`类

 `DecisionTreeClassifier`类初始化

    参数:

      - `criterion`:字符串类型,在代码中设置为`'gini'`。它用于衡量分裂质量的标准,`'gini'`表示使用基尼不纯度来选择最佳分裂点。基尼不纯度衡量了从数据集中随机选择一个样本,其被错误分类的概率。较低的基尼不纯度表示更好的分裂效果。

      - `splitter`:字符串类型,设置为`'best'`。它决定了在每个节点上选择分裂特征的策略,`'best'`表示选择最佳的分裂特征,即能够最大程度降低不纯度的特征。

      - `max_depth`:整数类型,为`5`。它限制了决策树的最大深度。限制树的深度可以防止过拟合,使模型在训练数据上表现良好的同时,也能在未见过的数据上有较好的泛化能力。较浅的树可能会欠拟合,而太深的树容易过拟合。

      - `class_weight`:字符串类型,设置为`'balanced'`。当数据集中不同类别样本数量不平衡时,这个参数可以调整每个类别的权重。`'balanced'`表示自动根据样本数量计算类别权重,使得每个类别在模型训练中的重要性相对均衡,有助于提高对少数类别的分类性能。

      - `random_state`:整数类型,为`2024`。与`train_test_split`中的`random_state`类似,它是一个随机种子,用于确保决策树构建过程中的随机性在每次运行代码时相同,使得结果具有可重复性。例如,在选择分裂特征时,如果有多个特征具有相同的分裂质量,随机种子可以确定选择哪一个特征。

 `fit`方法

    参数:

      `X_train`:二维列表类型,是训练集的特征数据,用于训练决策树模型,使模型学习特征与目标之间的关系。

      `y_train`:一维列表类型,是训练集的目标数据,为模型提供正确的分类标签,以便模型调整参数以最小化预测误差。

    作用:使用训练数据`X_train`和`y_train`来训练决策树模型,构建决策树的结构并确定每个节点的分裂规则。

 predict方法

    参数:

      `X_test`:二维列表类型,是测试集的特征数据,模型将根据在训练阶段学习到的知识对这些数据进行预测,输出预测的目标类别。

    作用:对测试集特征数据`X_test`进行预测,返回预测的目标类别`y_pred`,这些预测结果将用于与真实的测试集目标`y_test`进行比较,以评估模型的性能。

 

通过使用这些库及其提供的功能和参数,可以方便地实现数据处理、降维、模型训练和评估等操作,构建和分析机器学习模型。在实际应用中,可以根据数据集的特点和任务需求调整这些参数,以获得更好的模型性能。  

 

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

(1)准确率:***

【此处放截图】

目的1:

 

 

 

目的2:

 

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

【此处放截图】

目的1:

 

 

目的2:

 

【后边实验都按照这个格式写】

 

四、心得体会

 

在完成此次机器学习任务过程中,我有诸多深刻体会。在数据准备阶段,利用`pandas`库读取`iris`数据集时,需格外留意文件路径和列名指定,这是后续分析的基石。数据清洗中处理空值和转换数据类型时,要根据实际情况选择合适策略,确保数据质量。模型训练时,选择合适模型(如随机森林)并正确初始化参数很关键。而评估模型时,五折交叉验证及计算准确度等指标让我更全面了解模型性能。整个过程让我对机器学习流程有了更清晰认识,收获满满。


 

posted @ 2025-01-02 15:32  jais  阅读(36)  评论(0)    收藏  举报