一.案例介绍

数据来源于机器学习官方上传的数据,别分进行数据加载、绘制数据散点图、数据分割、完整案例演示以及利用交叉验证和网格搜索寻找最优超参的练习

二.代码分部详解

1.包的导入

from sklearn.datasets import load_iris          # 加载鸢尾花测试集的.
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use('TkAgg')   # 解决后端错误
from sklearn.model_selection import train_test_split,GridSearchCV   # 分割训练集和测试集的
from sklearn.preprocessing import StandardScaler        # 数据标准化的
from sklearn.neighbors import KNeighborsClassifier      # KNN算法 分类对象
from sklearn.metrics import accuracy_score              # 模型评估的, 计算模型预测的准确率

2.加载鸢尾花数据集并查看数据

def dm01_loadiris():
    #1.加载鸢尾花数据集
    iris_data = load_iris()
    #2.查看数据集
    # print(f'数据集:{iris_data}')    #字典形态
    # print(f'数据集的类型:{type(iris_data)}')
    #3.查看数据集所有的键
    # print(f'数据集所有的键:{iris_data.keys()}')
    # print(f'具体的数据:{iris_data.data[:5]}')           #150条数据,每个数据有4个特征,取前5个
    # print(f'具体的标签:{iris_data.target[:5]}')         #150条数据,每条数据有1个标签,取前5条
    # print(f'标签对应的名称:{iris_data.target_names}')
    # print(f'具体的数据:{iris_data.feature_names}')

结果展示

3.绘制数据的散点图

def dm02_show_iris():
    #加载数据集
    iris_data = load_iris()
    #2.把鸢尾花数据集封装成DataFrame对象  #
    iris_df = pd.DataFrame(iris_data.data, columns=iris_data.feature_names)
    iris_df['label'] = iris_data.target
    #print(iris_df)
    #4.通过Seaborn绘制散点图

    #           参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)
    #5.设置标题,显示
    plt.title('iris data')
    plt.tight_layout()   #自动调整子图参数,以使整个图像的边界与子图匹配
    plt.show()

效果展示

4.切分训练集和测试集

def dm03_split_train_test():
    #1.加载数据集
    iris_data = load_iris()
    #2.数据的预处理:从150个特征和标签中,按照8:2的比例,切分训练集和测试集
    #返回值:训练集的特征,测试集的特征,训练集的标签,测试集的标签
    x_train, x_test, y_train, y_test =  train_test_split(iris_data.data, iris_data.target, test_size=0.2, random_state=23)

    #3.打印切割后的结果
    print(f'训练集的特征:{x_train},个数:{len(x_train)}')    #120条,每条4列(特征)
    print(f'训练集的标签:{y_train},个数:{len(y_train)}')    #120条,每条1列(标签)
    print(f'测试集的特征:{x_test},个数:{len(x_test)}')      #30条,每条4列(特征)
    print(f'测试集的标签:{y_test},个数:{len(y_test)}')      #30条,每条1列(标签)

效果展示(按照4:1,将150条数据划分为训练集和测试集)

5.实现鸢尾花的完整案例

def dm04_iris_evaluate_test():
    #1.加载数据集
    iris_data = load_iris()
    #2.数据的预处理,这里是把150条数据,按照8:2的比例,分割训练集和测试集。
    x_train, x_test, y_train, y_test = train_test_split(iris_data.data, iris_data.target, test_size=0.2, random_state=23)
    #3.特征工程
    #思考1:特征提取:应为原数据只有4个特征列,都是我们用的,所以这里无需做特征提取
    #思考2:特征预处理
    #3.1创建标准化对象
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)#fit_tarnsform是训练+转化兼具,第一次标准化使用,一般用于训练集
    x_test = transfer.transform(x_test)      #transform只有转化,重复标准化时使用,一般用于测试集

    #4.模型训练
    #4.1创建模型对象
    estimator = KNeighborsClassifier(n_neighbors=3)
    #4.2具体的训练模型的动作
    estimator.fit(x_train,y_train)

    #模型的预测
    #场景1:对刚才切分的测试集(30条)进行测试
    y_pre = estimator.predict(x_test)
    print((f'预测的结果为{y_pre}'))
    #场景2:对新数据进行测试
    #5.1自定义预测测试集
    my_data = [[7.8, 2.1, 3.9, 1.6]]
    my_data = transfer.transform(my_data)
    #5.3模型的预测
    y_pre_new = estimator.predict(my_data)
    print(f'新的预测结果为{y_pre_new}')
    #5.4 查看上述数据集,各种分类的预测概率
    y_pre_proba = estimator.predict_proba(my_data)
    print(f'(各分类)预测概率为{y_pre_proba}')

    #6. 模型评估
    #方式1:直接评分,基于:训练集的特征 和 训练集的标签
    print(f'正确率(准确率):{estimator.score(x_train,y_train)}')

    #方式2:基于测试集的标签和预测结果
    print(f'正确率(准确率):{accuracy_score(y_test,y_pre)}')

效果展示

6.完整代码展示

# 导入工具包
from sklearn.datasets import load_iris          # 加载鸢尾花测试集的.
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use('TkAgg')   # 解决后端错误
from sklearn.model_selection import train_test_split,GridSearchCV   # 分割训练集和测试集的
from sklearn.preprocessing import StandardScaler        # 数据标准化的
from sklearn.neighbors import KNeighborsClassifier      # KNN算法 分类对象
from sklearn.metrics import accuracy_score              # 模型评估的, 计算模型预测的准确率


#d定义函数,加载鸢尾花数据集,并查看数据
def dm01_loadiris():
    #1.加载鸢尾花数据集
    iris_data = load_iris()
    #2.查看数据集
    print(f'数据集:{iris_data}')    #字典形态
    print(f'数据集的类型:{type(iris_data)}')
    #3.查看数据集所有的键
    print(f'数据集所有的键:{iris_data.keys()}')
    print(f'具体的数据:{iris_data.data[:5]}')           #150条数据,每个数据有4个特征,取前5个
    print(f'具体的标签:{iris_data.target[:5]}')         #150条数据,每条数据有1个标签,取前5条
    print(f'标签对应的名称:{iris_data.target_names}')
    print(f'具体的数据:{iris_data.feature_names}')

#2.绘制数据集的散点图
def dm02_show_iris():
    #加载数据集
    iris_data = load_iris()
    #2.把鸢尾花数据集封装成DataFrame对象  #
    iris_df = pd.DataFrame(iris_data.data, columns=iris_data.feature_names)
    iris_df['label'] = iris_data.target
    #print(iris_df)
    #4.通过Seaborn绘制散点图

    #           参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)
    #5.设置标题,显示
    plt.title('iris data')
    plt.tight_layout()   #自动调整子图参数,以使整个图像的边界与子图匹配
    plt.show()

# 3.切分训练集和测试集
def dm03_split_train_test():
    #1.加载数据集
    iris_data = load_iris()
    #2.数据的预处理:从150个特征和标签中,按照8:2的比例,切分训练集和测试集
    #返回值:训练集的特征,测试集的特征,训练集的标签,测试集的标签
    x_train, x_test, y_train, y_test =  train_test_split(iris_data.data, iris_data.target, test_size=0.2, random_state=23)

    #3.打印切割后的结果
    print(f'训练集的特征:{x_train},个数:{len(x_train)}')    #120条,每条4列(特征)
    print(f'训练集的标签:{y_train},个数:{len(y_train)}')    #120条,每条1列(标签)
    print(f'测试集的特征:{x_test},个数:{len(x_test)}')      #30条,每条4列(特征)
    print(f'测试集的标签:{y_test},个数:{len(y_test)}')      #30条,每条1列(标签)
#4.实现鸢尾花完整案例-》  加载数据、数据预处理、特征工程、模型训练、模型评估、模型预测

def dm04_iris_evaluate_test():
    #1.加载数据集
    iris_data = load_iris()
    #2.数据的预处理,这里是把150条数据,按照8:2的比例,分割训练集和测试集。
    x_train, x_test, y_train, y_test = train_test_split(iris_data.data, iris_data.target, test_size=0.2, random_state=23)
    #3.特征工程
    #思考1:特征提取:应为原数据只有4个特征列,都是我们用的,所以这里无需做特征提取
    #思考2:特征预处理
    #3.1创建标准化对象
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)#fit_tarnsform是训练+转化兼具,第一次标准化使用,一般用于训练集
    x_test = transfer.transform(x_test)      #transform只有转化,重复标准化时使用,一般用于测试集

    #4.模型训练
    #4.1创建模型对象
    estimator = KNeighborsClassifier(n_neighbors=3)
    #4.2具体的训练模型的动作
    estimator.fit(x_train,y_train)

    #模型的预测
    #场景1:对刚才切分的测试集(30条)进行测试
    y_pre = estimator.predict(x_test)
    print((f'预测的结果为{y_pre}'))
    #场景2:对新数据进行测试
    #5.1自定义预测测试集
    my_data = [[7.8, 2.1, 3.9, 1.6]]
    my_data = transfer.transform(my_data)
    #5.3模型的预测
    y_pre_new = estimator.predict(my_data)
    print(f'新的预测结果为{y_pre_new}')
    #5.4 查看上述数据集,各种分类的预测概率
    y_pre_proba = estimator.predict_proba(my_data)
    print(f'(各分类)预测概率为{y_pre_proba}')

    #6. 模型评估
    #方式1:直接评分,基于:训练集的特征 和 训练集的标签
    print(f'正确率(准确率):{estimator.score(x_train,y_train)}')

    #方式2:基于测试集的标签和预测结果
    print(f'正确率(准确率):{accuracy_score(y_test,y_pre)}')





#测试
if __name__ == '__main__':
   #dm01_loadiris()
   #dm02_show_iris()
   #dm03_split_train_test()
   dm04_iris_evaluate_test()

三.交叉验证和网格搜索寻找最优超参K

1.导包

from sklearn.datasets import load_iris                              # 加载鸢尾花测试集的.
from sklearn.model_selection import train_test_split,GridSearchCV   # 分割训练集和测试集的,寻找最优超参(网格搜索+交叉验证)
from sklearn.preprocessing import StandardScaler                    # 数据标准化的
from sklearn.neighbors import KNeighborsClassifier                  # KNN算法 分类对象
from sklearn.metrics import accuracy_score                          # 模型评估的, 计算模型预测的准确率

2.加载数据

#1.加载鸢尾花数据集
iris_data = load_iris()

3.数据预处理(划分数据集)

#2.数据预处理

x_train,  x_test, y_train, y_test = train_test_split(iris_data.data,iris_data.target,test_size=0.2,random_state=22)

4.特征工程(标准化)

#3.特征工程——》标准化
#3.1创建标准化对象
transfor = StandardScaler()
#3.2对训练集和测试集的特征进行标准化
x_train = transfor.fit_transform(x_train)
x_test = transfor.transform(x_test)

5.模型训练

#4.模型训练
#4.1创建KNN分类对象
estimator = KNeighborsClassifier()
#4.2定义字典,记录超参可能出现的情况
param_dict = {'n_neighbors':[i for i in range(1,11)]}
#4.3创建GridSearchCV对象,寻找最优超参,使用网格搜索+交叉验证方式

#参1:要计算的最优超参模型对象
#参2:该模型超参可能出现的值
#参3:交叉验证的折数,这里4表示:每个超参组合,都会进行4此交叉验证,这里共计时4*10 = 40
#返回值:estimator——》处理后的模型对象
estimator = GridSearchCV(estimator,param_dict,cv = 4)
#4.4 具体的模型训练动作
estimator.fit(x_train,y_train)
#4.5 打印最优超参组合
print(f'最优评分:{estimator.best_score_}')
print(f'最优超参组合:{estimator.best_params_}')
print(f'最优的模型对象:{estimator.best_estimator_}')
print(f'具体的交叉验证结果:{estimator.cv_results_}')

6.模型评估

#5.模型评估
#5.1获取最优超参的模型对象
#estimator = estimator.best_estimator_
estimator = KNeighborsClassifier(n_neighbors=3)
#5.2训练模型
estimator.fit(x_train,y_train)
#5.3模型预测
y_pre = estimator.predict(x_test)
#5.4 模型评估
#参1:测试集 参2 预测集

print(f'准去率:{accuracy_score(y_test,y_pre)}')

7.完整代码展示

from sklearn.datasets import load_iris                              # 加载鸢尾花测试集的.
from sklearn.model_selection import train_test_split,GridSearchCV   # 分割训练集和测试集的,寻找最优超参(网格搜索+交叉验证)
from sklearn.preprocessing import StandardScaler                    # 数据标准化的
from sklearn.neighbors import KNeighborsClassifier                  # KNN算法 分类对象
from sklearn.metrics import accuracy_score                          # 模型评估的, 计算模型预测的准确率


#1.加载鸢尾花数据集
iris_data = load_iris()

#2.数据预处理

x_train,  x_test, y_train, y_test = train_test_split(iris_data.data,iris_data.target,test_size=0.2,random_state=22)

#3.特征工程——》标准化
#3.1创建标准化对象
transfor = StandardScaler()
#3.2对训练集和测试集的特征进行标准化
x_train = transfor.fit_transform(x_train)
x_test = transfor.transform(x_test)

#4.模型训练
#4.1创建KNN分类对象
estimator = KNeighborsClassifier()
#4.2定义字典,记录超参可能出现的情况
param_dict = {'n_neighbors':[i for i in range(1,11)]}
#4.3创建GridSearchCV对象,寻找最优超参,使用网格搜索+交叉验证方式

#参1:要计算的最优超参模型对象
#参2:该模型超参可能出现的值
#参3:交叉验证的折数,这里4表示:每个超参组合,都会进行4此交叉验证,这里共计时4*10 = 40
#返回值:estimator——》处理后的模型对象
estimator = GridSearchCV(estimator,param_dict,cv = 4)
#4.4 具体的模型训练动作
estimator.fit(x_train,y_train)
#4.5 打印最优超参组合
print(f'最优评分:{estimator.best_score_}')
print(f'最优超参组合:{estimator.best_params_}')
print(f'最优的模型对象:{estimator.best_estimator_}')
print(f'具体的交叉验证结果:{estimator.cv_results_}')

#5.模型评估
#5.1获取最优超参的模型对象
#estimator = estimator.best_estimator_
estimator = KNeighborsClassifier(n_neighbors=3)
#5.2训练模型
estimator.fit(x_train,y_train)
#5.3模型预测
y_pre = estimator.predict(x_test)
#5.4 模型评估
#参1:测试集 参2 预测集

print(f'准去率:{accuracy_score(y_test,y_pre)}')

效果展示

四.总结

通过鸢尾花案例,了解了训练模型的基本步骤以及调用KNN的API,对机器学习有了初步认识

更多推荐