要分的三类鸢尾花:
0、导包
# 导包 import seaborn as sns import pandas import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split # 分割训练集的测试集 from sklearn.preprocessing import StandardScaler # 数据标准化 from sklearn.metrics import accuracy_score # 模型评估,计算模型预测的准确率 from sklearn.neighbors import KNeighborsClassifier # KNN算法 from sklearn.datasets import load_iris # 加载鸢尾花测试集1、查看数据集
# 定义函数,加载鸢尾花数据集,并查看数据集 def dm01_loadiris(): # 加载鸢尾花数据集 iris_data = load_iris() # 查看数据集 print(iris_data) # 字典形态 # print(f"data type:{type(iris_data)}") # 查看数据集的键 print(f'数据集的键:{iris_data.keys()}') #dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename', 'data_module']) # 键对应的值 print(f'具体的数据:{iris_data.data[:5]}') # 前五条,其中一条: [[5.1 3.5 1.4 0.2]...] 有4个特征 print(f'具体的标签:{iris_data.target[:5]}') #[0 0 0 0 0] print(f'标签对应的名称:{iris_data.target_names}') # ['setosa' 'versicolor' 'virginica'] print(f'特征对应的名称:{iris_data.feature_names}') #['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)'] if __name__ == '__main__': dm01_loadiris()运行结果:
2、绘制鸢尾花的散点图
# 定义函数,绘制鸢尾花的散点图 def dm02_show_iris(): # 加载数据集 iris_data = load_iris() # 把数据集中的 data 封装成DataFrame对象 iris_df = pd.DataFrame(iris_data.data, columns=iris_data.feature_names) # 给df对象新增label列 iris_df['label'] = iris_data.target print(iris_df) # 绘制散点图 # 参1:数据集 参2:X轴 参3:y轴 参4:分组字段 参5:是否显示拟合回归线 sns.lmplot(data=iris_df, x='sepal length (cm)', y='sepal width (cm)', hue='label', fit_reg=False) # 设置标题,显式 plt.title("iris data") plt.tight_layout() # 自动调整子图参数,以使整个图像的边界与子图匹配 plt.show() if __name__ == '__main__': # dm01_loadiris() dm02_show_iris()运行结果:
3、数据集划分
主要是用到 from sklearn.model_selection import train_test_split
# 定义函数,切分训练集和测试集 def dm03_split_train_test(): # 加载数据 iris_data = load_iris() # 共150条特征和标签 # 数据的预处理 # 参1:特征数据 参2:标签数据 参3:测试集比例 参4:随机种子(种子一致,每次生成的随机数据集都是固定的) # 返回值:训练集、测试集的特征数据;训练集、测试集的标签数据 x_train, x_test, y_train, y_test = train_test_split(iris_data.data, iris_data.target, test_size=0.2, random_state=23) # 打印切割后的结果 print(f'训练集的特征:{x_train},个数:{len(x_train)}') print(f'测试集的特征:{x_test},个数:{len(x_test)}') print(f'训练集的标签:{y_train},个数:{len(y_train)}') print(f'训练集的标签:{y_test},个数:{len(y_test)}') if __name__ == '__main__': dm03_split_train_test()运行结果:
4、实现鸢尾花完整案例
重点都在注释里了。
# 定义函数,实现鸢尾花完整案例 --> 加载数据、数据预处理、特征工程、模型训练 def dm04_complite(): # 加载数据 iris_data = load_iris() # 数据预处理 x_train, x_test, y_train, y_test = train_test_split(iris_data.data, iris_data.target, test_size=0.2, random_state=23) # 特征工程 # 思考1: 特征提取: 因为源数据只有四个特征列,且都是我们用的,所以这里无需做特征提取 # 思考2: 特征预处理:因为源数据4列特征的量纲差别不大,无需做特征处理。但!为了理解步骤,这里还是加上了标准化 # 对数据进行标准化 # 1.创建标准化对象 transfer = StandardScaler() # 2.特征列进行标准化,即:x_train 和 x_test # 2.1 对训练集进行标准化 # fit_transform: 兼具fit和transform的功能,即:训练,转换。一般适用于:第一次进行标准化,一般是处理:训练集。 x_train = transfer.fit_transform(x_train) # 2.2 对测试集进行标准化 # transform:只有转换。该函数适用于:重复进行标准化动作是使用,一般用于测试集。 x_test = transfer.transform(x_test) # 模型训练 # 创建模型对象 estimator = KNeighborsClassifier(n_neighbors=3) # 具体的训练动作 estimator.fit(x_train,y_train) # 模型预测 # 场景1:对刚才切分的测试集进行测试 y_pred_1 = estimator.predict(x_test) print(f'测试集的预测结果为:{y_pred_1}') # 场景2:对新的数据集进行测试 # 自定义测试数据集 my_data = [[7.8,2.2,3.9,1.6]] # 注意!! 要对数据进行标准化处理 my_data = transfer.transform(my_data) # 进行预测 y_pred_2 = estimator.predict(my_data) print(f'自定义数据集的预测结果为:{y_pred_2}') # 模型评估 # 方式1:直接评分,基于:测试集的特征 和 测试集的标签 print(f"正确率:{estimator.score(x_test,y_test)}") # 方式2:基于 测试集的特征 和 预测结果 print(f'正确率:{accuracy_score(y_test,y_pred_1)}') if __name__ == '__main__': dm04_complite()运行结果: