欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > 机器学习(基础3)

机器学习(基础3)

2025/11/20 14:19:08 来源:https://blog.csdn.net/tang1389764/article/details/143746440  浏览:    关键词:机器学习(基础3)

sklearn机器学习概述

获取数据、数据处理、特征工程后,就可以交给预估器进行机器学习,流程和常用API如下。

1.实例化预估器(估计器)对象(estimator), 预估器对象很多,都是estimator的子类(1)用于分类的预估器sklearn.neighbors.KNeighborsClassifier k-近邻sklearn.naive_bayes.MultinomialNB 贝叶斯sklearn.linear_model.LogisticRegressioon 逻辑回归sklearn.tree.DecisionTreeClassifier 决策树sklearn.ensemble.RandomForestClassifier 随机森林(2)用于回归的预估器sklearn.linear_model.LinearRegression线性回归sklearn.linear_model.Ridge岭回归(3)用于无监督学习的预估器sklearn.cluster.KMeans 聚类
2.进行训练,训练结束后生成模型estimator.fit(x_train, y_train)
3.模型评估(1)方式1,直接对比y_predict = estimator.predict(x_test)y_test == y_predict(2)方式2, 计算准确率accuracy = estimator.score(x_test, y_test)
4.使用模型(预测)
y_predict = estimator.predict(x_true)

KNN算法-分类

1 样本距离判断

明可夫斯基距离:
1.欧式距离,明可夫斯基距离的特殊情况 
2.曼哈顿距离,明可夫斯基距离的特殊情况 

欧式距离:两点之间直接连线的距离。

曼哈顿距离:

2 KNN 算法原理

K-近邻算法(K-Nearest Neighbors,简称KNN),根据K个邻居样本的类别来判断当前样本的类别;

如果一个样本在特征空间中的k个最相似(最邻近)样本中的大多数属于某个类别,则该类本也属于这个类别

3 KNN缺点

对于大规模数据集,计算量大,因为需要计算测试样本与所有训练样本的距离。

对于高维数据,距离度量可能变得不那么有意义,这就是所谓的“维度灾难”

需要选择合适的k值和距离度量,这可能需要一些实验和调整

4 API

class sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, algorithm='auto')
参数:                                             
(1)n_neighbors: int, default=5, 默认情况下用于kneighbors查询的近邻数,就是K
(2)algorithm:{‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’}, default=’auto’。找到近邻的方式,注意不是计算距离的方式,与机器学习算法没有什么关系,开发中请使用默认值'auto'
方法:(1) fit(x, y) 使用X作为训练数据和y作为目标数据  (2) predict(X)	预测提供的数据,得到预测数据   

5 sklearn 实现KNN示例

用KNN算法对葡萄酒进行分类

from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
x,y = load_wine(return_X_y=True)
# 划分数据集
x_train,x_test,y_train,y_test = train_test_split(x,y,train_size=0.8,random_state=22)
# 标准化训练特征# 创建标准化工具
transfer = StandardScaler()
data1 = transfer.fit_transform(x_train)
data2 = transfer.transform(x_test)
# knn工具,k=7表示找7个邻近来判断自身类型.
knn = KNeighborsClassifier(n_neighbors=12)
# 根据训练特征和训练目标在自己学习
knn.fit(data1,y_train)
# 模型评估
y_predict = knn.predict(data2)
print('y_predict:\n',y_predict)
print('y_test:\n',y_test)
# 计算准确率
score = knn.score(data2,y_test)
print("准确率为:\n", score)

6 模型保存与加载

模型选择与调优

交叉验证

(1) 保留交叉验证HoldOut

HoldOut Cross-validation(Train-Test Split)

在这种交叉验证技术中,整个数据集被随机地划分为训练集和验证集。根据经验法则,整个数据集的近70%被用作训练集,其余30%被用作验证集。也就是我们最常使用的,直接划分数据集的方法。

(2) K-折交叉验证(K-fold)

K-Fold交叉验证技术中,整个数据集被划分为K个大小相同的部分。每个分区被称为 一个”Fold”。所以我们有K个部分,我们称之为K-Fold。一个Fold被用作验证集,其余的K-1个Fold被用作训练集。

该技术重复K次,直到每个Fold都被用作验证集,其余的作为训练集。

模型的最终准确度是通过取k个模型验证数据的平均准确度来计算的。

(3) 分层k-折交叉验证Stratified k-fold

(4) API

from sklearn.model_selection import StratifiedKFold

说明:普通K折交叉验证和分层K折交叉验证的使用是一样的 只是引入的类不同

from sklearn.model_selection import KFold

使用时只是KFold这个类名不一样其他代码完全一样

strat_k_fold=sklearn.model_selection.StratifiedKFold(n_splits=5, shuffle=True, random_state=42)​	n_splits划分为几个折叠 
​	shuffle是否在拆分之前被打乱(随机化),False则按照顺序拆分
​	random_state随机因子indexs=strat_k_fold.split(X,y) ​	返回一个可迭代对象,一共有5个折叠,每个折叠对应的是训练集和测试集的下标​	然后可以用for循环取出每一个折叠对应的X和y下标来访问到对应的测试数据集和训练数据集 以及测试目标集和训练目标集for train_index, test_index in indexs:​	X[train_index]    y[train_index]   X[test_index ]  y[test_index ]

(5)示例

from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import StratifiedKFoldiris = load_iris()
x = iris.data
y = iris.target
# 创建分层工具
# n_splits划分为几个折叠
# shuffle是否在拆分之前被打乱(随机化),False则按照顺序拆分
fenceng = StratifiedKFold(n_splits=5,shuffle=True,random_state=42)
# 创建一个分类器
knn = KNeighborsClassifier(n_neighbors=5)
# 交叉验证
list01 = []
for train_index,test_index in fenceng.split(x,y):# print(train_index,test_index)x_train,x_test = x[train_index],x[test_index]y_train,y_test = y[train_index],y[test_index]# 特征预处理# 标准化工具transfer = StandardScaler()# 训练集标准化x_train = transfer.fit_transform(x_train)x_test = transfer.transform(x_test)# 使用K近邻分类器进行训练,根据训练特征和训练目标在自己学习knn.fit(x_train,y_train)# 输出每次的得分socre = knn.score(x_test,y_test)print('本次得分:',socre)list01.append(socre)
print('平均准确率:',sum(list01)/len(list01))

2 超参数搜索

超参数搜索也叫网格搜索(Grid Search)

比如在KNN算法中,k是一个可以人为设置的参数,所以就是一个超参数。网格搜索能自动的帮助我们找到最好的超参数值。

3 sklearn API

class sklearn.model_selection.GridSearchCV(estimator, param_grid)说明:
同时进行交叉验证(CV)、和网格搜索(GridSearch),GridSearchCV实际上也是一个估计器(estimator),同时它有几个重要属性:best_params_  最佳参数best_score_ 在训练集中的准确率best_estimator_ 最佳估计器cv_results_ 交叉验证过程描述best_index_最佳k在列表中的下标
参数:estimator: scikit-learn估计器实例param_grid:以参数名称(str)作为键,将参数设置列表尝试作为值的字典示例: {"n_neighbors": [1, 3, 5, 7, 9, 11]}cv: 确定交叉验证切分策略,值为:(1)None  默认5折(2)integer  设置多少折如果估计器是分类器,使用"分层k-折交叉验证(StratifiedKFold)"。在所有其他情况下,使用KFold。

4 示例

# 用KNN算法对鸢尾花进行分类,添加网格搜索和交叉验证
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
# 获取数据
iris = load_iris()
# 划分数据集
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,train_size=0.8,random_state=22)
# 标准化
transfer = StandardScaler()  # 标准化器
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 训练
knn = KNeighborsClassifier() # 模型
# 网格搜索,GridSearchCV会让k分别等于1,2,5,7,9,11,13,15进行网格搜索偿试。cv=10表示进行10次交叉验证
knn = GridSearchCV(knn,param_grid={'n_neighbors':[1,3,5,7,9,11,13,15]},cv=10)
knn.fit(x_train,y_train)
# 模型评估
y_predict = knn.predict(x_test)
print(y_predict)
print(y_test)
# re = y_predict == y_test
# score = np.sum(re)/len(re)
# print('准确率:',score)score = knn.score(x_test,y_test)
print(score)# 最佳参数
print(knn.best_params_) # 'n_neighbors': 5 ,即k=5时最好
# 最佳结果
print(knn.best_score_) # 0.9666666666666666
# 最佳模型
print(knn.best_estimator_) # KNeighborsClassifier() 即默认k=5时最好
# 交叉验证结果
print(knn.cv_results_) # 详细过程
# 最佳k在列表中的下标
print(knn.best_index_) # 2

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词