赞
踩
KNN算法API: 官方说明请点击这里进入,不过都是英文,推荐一篇博客,点击这里进入,比较直观清晰,以下部分也是摘自这篇博客,整理,修改和归纳后如下:
KNeighborsClassifier参数说明:
KNeighborsClassifier(n_neighbors=5, weights='uniform', algorithm='auto', leaf_size=30, p=2, metric='minkowski', metric_params=None, n_jobs=None, **kwargs) # 解释说明: n_neighbors:所选用的近邻数,相当于K。 weights的参数设置: - uniform:同一的权重,即每个邻域中的所有点都是平均加权的。 - distance:这种情况下,距离越近权重越大,反之,距离越远其权重越小。 - [callable](可调用):用户定义的函数,它接受一个距离数组,并返回一个包含权重的相同形状的数组。 algorithm :用于计算最近邻居的算法,。有{auto, ball_tree, kd_tree, brute}。 - auto :根据样本数据自动刷选合适的算法,判断维数(特征值)是否大于20,小于20用kd_tree,大于20用ball_tree,如果数据集特别简单,用brute一个个检索就可以了。 - ball_tree:构建“球树”算法模型,超球体分割。 - kd_tree:“kd树”算法,超平面分割。 - brute:使用蛮力搜索,即或相当于Knn算法,需遍历所有样本数据与目标数据的距离,进而按升序排序从而选取最近的K个值,采用投票得出结果。 leaf_size:叶的大小,针对算法为球树或KD树而言。这个设置会影响构造和查询的速度,以及存储树所需的内存。最优值取决于问题的性质。 p:Minkowski度量参数的参数来自sklearn.emeics.pairwise.pairwise_距离。当p=1时,这等价于使用曼哈顿距离(L1),欧几里得距离(L2)等价于p=2时,对于任意的p,则使用Minkowski_距离(L_P)。 metric:用于树的距离度量。默认度量是Minkowski,p=2等价于标准的欧几里德度量。有关可用度量的列表,可以查阅距离度量类的文档。如果度量是“预先计算的”,则假定X是距离矩阵,在拟合期间必须是平方。 metric_params:度量函数的附加关键字参数,设置应为dict(字典)形式。 n_jobs:要为邻居搜索的并行作业的数量。None指1,除非在 joblib.parallel_backend背景。-1意味着使用所有处理器,若要了解相关的知识应该具体查找一下。
回顾鸢尾花数据集:
实例数量:150个(三个种类各有50个)
属性数量:4(数值型,数值型,帮助预测的属性和类)
Attribute Information:
- sepal length:萼片长度(cm)
- sepal width:萼片宽度(cm)
- petal lengh:花瓣长度(cm)
- petal width:花瓣宽度(cm)
Class:
- Iriss-Setosa:山鸢尾
- Iris-Versicolour:变色鸢尾
- Iris-Virginica:维吉尼亚鸢尾
步骤分析:
- 获取数据集
- 数据基本处理
- 特征工程
- 机器学习(模型训练)
- 模型评估
下边采用的数据集是sklearn中自带的鸢尾花数据集:
核心代码:
from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.neighbors import KNeighborsClassifier # - 获取数据集 iris=load_iris() # - 数据基本处理 # 数据分割,处理数据的异常值,由于数据很标准,只做分割处理 x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,random_state=22,test_size=0.2) # - 特征工程 # 实例化一个转换器 transfer=StandardScaler() x_train=transfer.fit_transform(x_train) x_test=transfer.fit_transform(x_test) # - 机器学习(模型训练) # 实例化一个估计器 estimator=KNeighborsClassifier(n_neighbors=5) # 进行模型训练 estimator.fit(x_train,y_train) # - 模型评估 # 输出预测值 y_pre=estimator.predict(x_test) print("对测试集目标值的预测为:\n",y_pre) print("对测试集的预测值和本身的真实值对比:\n",y_pre==y_test) # 输出准确率 ret=estimator.score(x_test,y_test) print("预测的成功率为:",ret)
实现效果:
在上述实验的基础上进行改进,采用逻辑回归(后期详细更新)的方法,即本次实验的过程:
初步了解:
逻辑回归初步认知:点击此处进入
在scikit-learn中,与逻辑回归有关的类库的使用:点击此处查看
scikit-learn官方文档:点击此处进入
实验代码:
from sklearn.datasets import load_iris from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 模型评估 iris = load_iris() # 读入数据集 # 分割数据集为训练集和测试集 x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=0) # 配置并实例化逻辑回归分类器 logreg = LogisticRegression(C=1e5, solver='lbfgs', multi_class="multinomial",max_iter=3000) # 调用fit(x,y)来训练模型,其中x为训练集的特征值,y为训练集的目标值。 logreg.fit(x_train, y_train) # 利用训练好的模型对测试集进行预测,返回预测的目标值数组 y_predict = logreg.predict(x_test) print("测试集中真实的目标值为:\n",y_test) print("测试集中预测的目标值为:\n",y_predict) print("对测试集的预测值和本身的真实值对比:\n",y_predict==y_test) print("预测的成功率为:",accuracy_score(y_test, y_predict))
运行结果:
实验过程可按顺序参考前两篇博文:机器学习 鸢尾花分类的原理和实现(一)和机器学习 鸢尾花分类的原理和实现(二)
推荐几篇写的不错的文章作为总结:
L1和L2正则化讲解 文章推荐:
l1正则与l2正则的特点是什么,各有什么优势?
机器学习中的范数规则化之(一)L0、L1与L2范数
一文搞懂深度学习正则化的L2范数
逻辑回归讲解推荐(知乎):机器学习 | 逻辑回归算法(二)LogisticRegression
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。