重生归来,我要成功 Python 高手--day29 利用KNN算法对鸢尾花进行分类,和使用超参数方法实现
实现流程:
1.获取数据集
2.数据集的基本处理
3.数据集的预处理(特征工程)
4.机器学习(模型训练)
5.模型评估
6.模型预测
数据集的导入:
from sklearn.datasets import load_iris # 导入鸢尾花数据集
数据集的划分:
from sklearn.model_selection import train_test_split # 划分数据集
x_trian, x_test, y_trian, y_test = train_test_split(data_iris.data, data_iris.target, test_size=0.2, random_state=18)
这个函数会返回四个值,分别为训练集特征,测试集特征,训练集标签,测试集标签
函数中的参数:特征,标签,测试集划分的百分比,随机种子:保证了数是不变的
# 导包 import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import load_iris # 导入鸢尾花数据集 from sklearn.metrics import accuracy_score from sklearn.model_selection import train_test_split # 划分数据集 from sklearn.neighbors import KNeighborsClassifier # 分类问题 from sklearn.preprocessing import StandardScaler # 标准化 import seaborn as sns # 数据可视化包
# 分析数据集
def ywh():
data = load_iris()
print(data.keys())
print(data.data)
print(data.target)
# 模型的评估与预测
def pgandyc():
# 获取数据集
data_iris = load_iris()
# 对数据集进行划分
x_train, x_test, y_train, y_test = train_test_split(data_iris.data, data_iris.target, test_size=0.2,
random_state=21)
# 获取对象
transfer = StandardScaler()
# 对特征列进行标准化
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 进行模型创建和训练
model = KNeighborsClassifier(n_neighbors=5)
model.fit(x_train, y_train)
# 使用测试集特征进行模型的预测
y_predict = model.predict(x_test)
print(f'预测的结果{y_predict}')
print(f'真实的结果{y_test}')
# 第一个参数是真实标签,第二个参数是预测标签
print(f'准确率是{accuracy_score(y_test, y_predict)}')
print(f'准确率是{model.score(x_test, y_test)}')
# 创建一个新的特征
x_test_new = [[2.1, 3.5, 5.6, 3.2]]
y_test_new = model.predict(x_test_new)
print(f'花的分类是{y_test_new}')
if __name__ == '__main__':
pgandyc()
超参数:就是人手动输入的参数,超参数的本质是为模型学习过程划定规则、范围或初始条件,直接影响模型的学习效率、泛化能力和最终性能好的超参数调优往往能让模型性能提升一个档次,是机器学习工程中至关重要的环节。
常用的超参数调优:网格搜索和交叉验证
交叉验证:对已经划分训练集和测试集的的数据,拿训练集进一步划分,划分为n分,拿其中的一份为测试集,其他的n-1份为训练集,交叉验证法,是划分数据集的一种方法,目的就是为了得到更加准确可信的模型评分
网格搜索:模型有很多超参数,其能力也存在很大的差异。需要手动产生很多超参数组合,来训练模型,只需要将若干参数传递给网格搜索对象,它自动帮我们完成不同超参数的组合、模型训练、模型评估,最终返回一组最优的超参数。
所有网格搜索和交叉验证一般一起使用完成模型的选择和调优:
交叉验证解决模型的数据输入问题(数据集划分)得到更可靠的模型 网格搜索解决超参数的组合 两个组合再一起形成一个模型参数调优的解决方案
使用的API:GridSearchCV在模型划分后面
这个函数的参数分别为:参数一进行调优的模型。参数二超参数的范围,参数三进行交叉验证的次数也是折数,这个计算的次数为超参数的范围乘以折数
param_grid={ 'n_neighbors':[i for i in range(1,11)] } 创建超参数的范围
model=GridSearchCV(model,param_grid,cv=4)
模型准确率的获取:
accuracy_score:参数(测试集真实的标签,模型识别的标签)
准确率 = 预测正确的样本数 / 总样本数
例如,若测试集中有 100 个样本,模型预测对了 85 个,则准确率为 85%,函数会返回 0.85。
# 导包
from sklearn.datasets import load_iris # 导入鸢尾花数据集
from sklearn.metrics import accuracy_score # 准确率
from sklearn.model_selection import train_test_split , GridSearchCV # 划分数据集
from sklearn.neighbors import KNeighborsClassifier # 分类问题
from sklearn.preprocessing import StandardScaler # 标准化
# 获取数据集
data_iris = load_iris()
# 数据集的划分,参数为:特征 标签 测试集的数量 随机种子
x_train, x_test, y_train, y_test = train_test_split(data_iris.data, data_iris.target, test_size=0.2,
random_state=21)
# 特征工程,标准化
transfer=StandardScaler()
x_train=transfer.fit_transform(x_train)
x_test=transfer.transform(x_test)
# 模型的创建
model = KNeighborsClassifier()
#超参数的创建
param_grid={
'n_neighbors':[i for i in range(1,11)]
}
#模型的交叉验证和网格搜索
model=GridSearchCV(model,param_grid,cv=4)
# 模型的训练
model.fit(x_train,y_train)
# 打印最优超参组合
print(f'最优评分{model.best_score_}')
print(f'最优超参组合{model.best_params_}')
print(f'最优估计器对象{model.best_estimator_}')
# 模型的评估
# 方法一
model1=KNeighborsClassifier(n_neighbors=6)
model1.fit(x_train,y_train)
y_predict=model1.predict(x_test)
print(f'新建的准确率{accuracy_score(y_test,y_predict)}')
# 方法二
y_predict2=model.best_estimator_.predict(x_test)
print(f'直接用准确率{accuracy_score(y_test,y_predict2)}')
更多推荐
所有评论(0)