机器学习经典案例----鸢尾花的两种写法

经典版

代码示例

机器学习入门解释请参考上篇博客噢! 以下直接上代码示例

# 导包
from sklearn.preprocessing import StandardScaler  # 标准化
from sklearn.neighbors import KNeighborsClassifier,KNeighborsRegressor  # 分类和回归
from sklearn.datasets import load_iris  # 鸢尾花数据

#%%

#  1.数据加载
iris_data = load_iris()
# iris.feature_name  # 特征名字
#
# iris.target_name  # 目标值名称

X,y = load_iris(return_X_y=True) # 如果加上return_X_y=True 只会返回特征值和目标值

 # 对数据做简单的可视化
import pandas as pd
iris_df = pd.DataFrame(iris_data.data,columns=iris_data.feature_names)
iris_df['label'] = iris_data.target
iris_df

import seaborn as sns
# data 要绘图的数据, x x轴数据在df中的列名 y = y轴数据在df中的列名   hue 传入类别型取值的特征列, 会自动用不同颜色来表示, fit_reg=默认会拟合一个回归直线
sns.lmplot(data=iris_df,x='sepal length (cm)',y='petal width (cm)',fit_reg=False,hue ='label')
# hue = 'label' 用标签列, 对数据点进行区分展示, 3种不同的鸢尾花分别用不同的颜色显示

#%%

# 3, 特征工程

from sklearn.model_selection import train_test_split

# X 数据集的特征,y 数据集的目标,test_size 测试集的比例 random_state 随机数种子,写死了一个随机数种子每次得到的数据据集划分结果都是一样的
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=42)

# 特征工程
scaler = StandardScaler()  # 标准化

# 训练集 测试集 都要做标准化
scaler.fit(X_train)  # 计算均值 方差 120
X_train_scaled = scaler.transform(X_train)
# 以上两步可以   .fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# 特征工程需注意: 训练集 fit transfrom
#               测试集 直接transfrom

#%%

# 4, 模型训练

knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train_scaled,y_train)  # 使用标准化之后的特征值,进行模型训练

# knn特点: 不需要训练,数据就是模型本身,数据发生了变化,模型就发生了变化
# fit 的时候就是把X_tarin_scaled 和 y_train 保存下来了

#%%

# 5, 模型评估

from sklearn.metrics import accuracy_score
# 用模型 对训练集进行预测
X_train_pre = knn.predict(X_train_scaled)
# 用模型对测试集进行预测
X_test_pre =  knn.predict(X_test_scaled)

# 评估1
accuracy_score(y_train,X_train_pre)

#%%

# 评估2
accuracy_score(y_test,X_test_pre)

交叉网格版

交叉验证和网格搜索的概念

可以使用交叉验证和网格搜索来做超参数的调整

  • 超参数 就是创建算法模型对象的时候, 可以传入的参数

    • 对于KNN来说, 可以调整的参数包括

      • K 邻居的个数

      • P 距离测量方式

网格搜索

  • 把所有要尝试的参数组合, 都遍历一圈, 使用数据来训练对应模型, 通过测试集表现来找到最佳的参数组合

交叉验证

可以把训练数据进一步划分成训练集和验证集

  • cv = 4 把训练集划分成4份, 3份训练1份用来验证

把网格搜索和交叉验证结合起来, 就是在不同的数据中(训练集和验证集), 来尝试不同的参数组合

  • 每一个参数组合, 都会计算cv次, 每次的评估指标计算平均值, 通过指标平均值来判断哪组参数最好

代码示例
# 导包
from sklearn.datasets import load_iris  # 鸢尾花数据
from sklearn.preprocessing import StandardScaler  # 标准化
from sklearn.model_selection import train_test_split,GridSearchCV  # 划分,交叉验证
from sklearn.neighbors import KNeighborsClassifier # 分类器
from sklearn.metrics import accuracy_score  # 评估

# metrics 指标,所以评价的指标都在这个模块中 accuracy_score准确率
# model_selection 模型选择   train_test_split 训练集测试集划分 GridSearchCV 交叉验证

#%%

# 1.加载数据
iris = load_iris()

x,y = load_iris(return_X_y=True)  # 返回特征和目标

#%%

# 2. 数据集划分
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=0.2,random_state=22)

#%%

# 3.特征工程 标准化  只对x是特征值
scaler = StandardScaler()
x_train_scaled = scaler.fit_transform(x_train) # 训练集 计算均值方差
x_test_scaled = scaler.transform(x_test)  # 测试集直接使用训练集的均值和方差

#%%

# 4.模型训练 交叉验证和网格搜索
knn_estimator = KNeighborsClassifier(n_neighbors=3)

# 'n_neighbors': k的取值    'p': 度量方式 1是曼哈顿 2是欧氏距离
# 'weights': 权重 投票时的权重 , 默认'uniform'平权投票 所有样本权重都一样 ,'distance'加权投票 考虑距离的倒数作为权重
# param_grid_ : 设置估计器的参数
param_grid_ = {'n_neighbors':[2,3,4,5,6],'p':[1,2],'weights':['uniform','distance']}

# estimator:估计器的对象   param_grid:估计器的参数
grid_estimator = GridSearchCV(estimator=knn_estimator,param_grid=param_grid_,cv=4)

# 使用标准化后,训练集的数据进行模型训练
#knn_estimator.fit(x_train_scaled,y_train)
grid_estimator.fit(x_train_scaled,y_train)




#%%

# 5.模型评估
# 使用训练好的模型,对训练集 测试集进行分类
x_train_pred = grid_estimator.predict(x_train_scaled)
x_test_pred = grid_estimator.predict(x_test_scaled)

# 模型评估,计算准确率
accuracy_score(x_train_pred,y_train)
accuracy_score(x_test_pred,y_test)

你可能感兴趣的:(人工智能,机器学习)