机器学习入门解释请参考上篇博客噢! 以下直接上代码示例
# 导包
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)