关于机器学习:机器学习算法KNN鸢尾花种类预测案例和特征预处理全md文档笔记已分享附代码

49次阅读

共计 7368 个字符,预计需要花费 19 分钟才能阅读完成。

本系列文章 md 笔记(已分享)次要探讨机器学习算法相干常识。机器学习算法文章笔记以算法、案例为驱动的学习,随同浅显易懂的数学知识,让大家把握机器学习常见算法原理,利用 Scikit-learn 实现机器学习算法的利用,联合场景解决理论问题。包含 K - 近邻算法,线性回归,逻辑回归,决策树算法,集成学习,聚类算法。K- 近邻算法的间隔公式,利用 LinearRegression 或 SGDRegressor 实现回归预测,利用 LogisticRegression 实现逻辑回归预测,利用 DecisionTreeClassifier 实现决策树分类,利用 RandomForestClassifie 实现随机森林算法,利用 Kmeans 实现聚类工作。

全套笔记和代码自取移步 gitee 仓库:gitee 仓库获取残缺文档和代码

感兴趣的小伙伴能够自取哦,欢送大家点赞转发~


共 7 章,44 子模块

K- 近邻算法

学习指标

  • 把握 K - 近邻算法实现过程
  • 晓得 K - 近邻算法的间隔公式
  • 晓得 K - 近邻算法的超参数 K 值以及取值问题
  • 晓得 kd 树实现搜寻的过程
  • 利用 KNeighborsClassifier 实现分类
  • 晓得 K - 近邻算法的优缺点
  • 晓得穿插验证实现过程
  • 晓得超参数搜寻过程
  • 利用 GridSearchCV 实现算法参数的调优

1.8 案例:鸢尾花品种预测—流程实现

1 再识 K - 近邻算法 API

  • sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm=’auto’)

    • n_neighbors:

      • int, 可选(默认 = 5),k_neighbors 查问默认应用的街坊数
    • algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’}

      • 疾速 k 近邻搜索算法,默认参数为 auto,能够了解为算法本人决定适合的搜索算法。除此之外,用户也能够本人指定搜索算法 ball_tree、kd_tree、brute 办法进行搜寻,

        • brute 是蛮力搜寻,也就是线性扫描,当训练集很大时,计算十分耗时。
        • kd_tree,结构 kd 树存储数据以便对其进行疾速检索的树形数据结构,kd 树也就是数据结构中的二叉树。以中值切分结构的树,每个结点是一个超矩形,在维数小于 20 时效率高。
        • ball tree 是为了克服 kd 树高纬生效而创造的,其结构过程是以质心 C 和半径 r 宰割样本空间,每个节点是一个超球体。

2 案例:鸢尾花品种预测

2.1 数据集介绍

Iris 数据集是罕用的分类试验数据集,由 Fisher, 1936 收集整理。Iris 也称鸢尾花卉数据集,是一类多重变量剖析的数据集。对于数据集的具体介绍:

2.2 步骤剖析

  • 1. 获取数据集
  • 2. 数据根本解决
  • 3. 特色工程
  • 4. 机器学习(模型训练)
  • 5. 模型评估

2.3 代码过程

  • 导入模块
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
  • 先从 sklearn 当中获取数据集,而后进行数据集的宰割
  
  
# 1. 获取数据集
  
  
iris = load_iris()

  
  
# 2. 数据根本解决
  
  
  
  
# x_train,x_test,y_train,y_test 为训练集特征值、测试集特征值、训练集目标值、测试集目标值
  
  
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
  • 进行数据标准化

    • 特征值的标准化
  
  
# 3、特色工程:标准化
  
  
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
  • 模型进行训练预测
  
  
# 4、机器学习(模型训练)
  
  
estimator = KNeighborsClassifier(n_neighbors=9)
estimator.fit(x_train, y_train)
  
  
# 5、模型评估
  
  
  
  
# 办法 1:比对实在值和预测值
  
  
y_predict = estimator.predict(x_test)
print("预测后果为:\n", y_predict)
print("比对实在值和预测值:\n", y_predict == y_test)
  
  
# 办法 2:间接计算准确率
  
  
score = estimator.score(x_test, y_test)
print("准确率为:\n", score)

1.9 练一练

同学之间探讨方才实现的机器学习代码, 并且确保在本人的电脑是哪个运行胜利

总结

  • 在本案例中,具体实现内容有:
  • 应用可视化加载和摸索数据,以确定特色是否能将不同类别离开。
  • 通过标准化数字特色并随机抽样到训练集和测试集来筹备数据。
  • 通过统计学,精确度度量进行构建和评估机器学习模型。
  • k 近邻算法总结
  • 长处:
  * ** 简略无效 **
  * ** 从新训练的代价低 **
  * ** 适宜类域穿插样本 **
     * KNN 办法次要靠四周无限的邻近的样本, 而不是靠判断类域的办法来确定所属类别的,因而对于类域的穿插或重叠较多的待分样本集来说,KNN 办法较其余办法更为适宜。* ** 适宜大样本主动分类 **
     * 该算法比拟实用于样本容量比拟大的类域的主动分类,而那些样本容量较小的类域采纳这种算法比拟容易产生误分。
  • 毛病:
  * ** 惰性学习 **
     * KNN 算法是懒惰学习办法(lazy learning, 基本上不学习),一些踊跃学习的算法要快很多

  * ** 类别评分不是规格化 **
     * 不像一些通过概率评分的分类

  * ** 输入可解释性不强 **
     * 例如决策树的输入可解释性就较强

  * ** 对不平衡的样本不善于 **
     * 当样本不均衡时,如一个类的样本容量很大,而其余类样本容量很小时,有可能导致当输出一个新样本时,该样本的 K 个街坊中大容量类的样本占多数。该算法只计算“最近的”街坊样本,某一类的样本数量很大,那么或者这类样本并不靠近指标样本,或者这类样本很凑近指标样本。无论怎样,数量并不能影响运行后果。能够采纳权值的办法(和该样本间隔小的街坊权值大)来改良。* ** 计算量较大 **
     * 目前罕用的解决办法是当时对已知样本点进行剪辑,当时去除对分类作用不大的样本。

1.10 穿插验证,网格搜寻

1 什么是穿插验证(cross validation)

穿插验证:将拿到的训练数据,分为训练和验证集。以下图为例:将数据分成 4 份,其中一份作为验证集。而后通过 4 次 (组) 的测试,每次都更换不同的验证集。即失去 4 组模型的后果,取平均值作为最终后果。又称 4 折穿插验证。

1.1 剖析

咱们之前晓得数据分为训练集和测试集,然而 为了让从训练失去模型后果更加精确。做以下解决

  • 训练集:训练集 + 验证集
  • 测试集:测试集

1.2 为什么须要穿插验证

穿插验证目标:为了让被评估的模型更加精确可信

问题:那么这个只是对于参数得出更好的后果,那么怎么抉择或者调优参数呢?

2 什么是网格搜寻(Grid Search)

通常状况下,有很多参数是须要手动指定的(如 k - 近邻算法中的 K 值),这种叫超参数 。然而手动过程繁冗,所以须要对模型预设几种超参数组合。 每组超参数都采纳穿插验证来进行评估。最初选出最优参数组合建设模型。

3 穿插验证,网格搜寻(模型抉择与调优)API:

  • sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)

    • 对预计器的指定参数值进行详尽搜寻
    • estimator:预计器对象
    • param_grid:预计器参数(dict){“n_neighbors”:[1,3,5]}
    • cv:指定几折穿插验证
    • fit:输出训练数据
    • score:准确率
    • 后果剖析:

      • bestscore__: 在穿插验证中验证的最好后果
      • bestestimator:最好的参数模型
      • cvresults: 每次穿插验证后的验证集准确率后果和训练集准确率后果

4 鸢尾花案例减少 K 值调优

  • 应用 GridSearchCV 构建预计器
  
  
# 1、获取数据集
  
  
iris = load_iris()
  
  
# 2、数据根本解决 -- 划分数据集
  
  
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)
  
  
# 3、特色工程:标准化
  
  
  
  
# 实例化一个转换器类
  
  
transfer = StandardScaler()
  
  
# 调用 fit_transform
  
  
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
  
  
# 4、KNN 预估器流程
  
  
  
  
#  4.1 实例化预估器类
  
  
estimator = KNeighborsClassifier()

  
  
# 4.2 模型抉择与调优——网格搜寻和穿插验证
  
  
  
  
# 筹备要调的超参数
  
  
param_dict = {"n_neighbors": [1, 3, 5]}
estimator = GridSearchCV(estimator, param_grid=param_dict, cv=3)
  
  
# 4.3 fit 数据进行训练
  
  
estimator.fit(x_train, y_train)
  
  
# 5、评估模型成果
  
  
  
  
# 办法 a:比对预测后果和实在值
  
  
y_predict = estimator.predict(x_test)
print("比对预测后果和实在值:\n", y_predict == y_test)
  
  
# 办法 b:间接计算准确率
  
  
score = estimator.score(x_test, y_test)
print("间接计算准确率:\n", score)
  • 而后进行评估查看最终抉择的后果和穿插验证的后果
print("在穿插验证中验证的最好后果:\n", estimator.best_score_)
print("最好的参数模型:\n", estimator.best_estimator_)
print("每次穿插验证后的准确率后果:\n", estimator.cv_results_)
  • 最终后果
比对预测后果和实在值:[ True  True  True  True  True  True  True False  True  True  True  True
  True  True  True  True  True  True False  True  True  True  True  True
  True  True  True  True  True  True  True  True  True  True  True  True
  True  True]
间接计算准确率:0.947368421053
在穿插验证中验证的最好后果:0.973214285714
最好的参数模型:KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
           metric_params=None, n_jobs=1, n_neighbors=5, p=2,
           weights='uniform')
每次穿插验证后的准确率后果:{'mean_fit_time': array([ 0.00114751,  0.00027037,  0.00024462]), 'std_fit_time': array([1.13901511e-03,   1.25300249e-05,   1.11011951e-05]), 'mean_score_time': array([0.00085751,  0.00048693,  0.00045625]), 'std_score_time': array([3.52785082e-04,   2.87650037e-05,   5.29673344e-06]), 'param_n_neighbors': masked_array(data = [1 3 5],
             mask = [False False False],
       fill_value = ?)
, 'params': [{'n_neighbors': 1}, {'n_neighbors': 3}, {'n_neighbors': 5}], 'split0_test_score': array([0.97368421,  0.97368421,  0.97368421]), 'split1_test_score': array([0.97297297,  0.97297297,  0.97297297]), 'split2_test_score': array([0.94594595,  0.89189189,  0.97297297]), 'mean_test_score': array([0.96428571,  0.94642857,  0.97321429]), 'std_test_score': array([0.01288472,  0.03830641,  0.00033675]), 'rank_test_score': array([2, 3, 1], dtype=int32), 'split0_train_score': array([1.        ,  0.95945946,  0.97297297]), 'split1_train_score': array([1.        ,  0.96      ,  0.97333333]), 'split2_train_score': array([1.  ,  0.96,  0.96]), 'mean_train_score': array([1.        ,  0.95981982,  0.96876877]), 'std_train_score': array([0.        ,  0.00025481,  0.0062022])}

1.11 案例 2:预测 facebook 签到地位

1 数据集介绍

数据介绍:将依据用户的地位,准确性和工夫戳预测用户正在查看的业务。

train.csv,test.csv 
row_id:注销事件的 ID
xy:坐标
准确性:定位准确性 
工夫:工夫戳
place_id:业务的 ID,这是您预测的指标

官网:https://www.kaggle.com/navoshta/grid-knn/data

2 步骤剖析

  • 对于数据做一些根本解决(这里所做的一些解决不肯定达到很好的成果,咱们只是简略尝试,有些特色咱们能够依据一些特征选择的形式去做解决)

    • 1 放大数据集范畴 DataFrame.query()
    • 2 选取有用的工夫特色
    • 3 将签到地位少于 n 个用户的删除
  • 宰割数据集
  • 标准化解决
  • k- 近邻预测

3 代码过程

  • 1. 获取数据集
  
  
# 1、获取数据集
  
  
facebook = pd.read_csv("./data/FBlocation/train.csv")
  • 2. 根本数据处理
  
  
# 2. 根本数据处理
  
  
  
  
# 2.1 放大数据范畴
  
  
facebook_data = facebook.query("x>2.0 & x<2.5 & y>2.0 & y<2.5")
  
  
# 2.2 抉择工夫特色
  
  
time = pd.to_datetime(facebook_data["time"], unit="s")
time = pd.DatetimeIndex(time)
facebook_data["day"] = time.day
facebook_data["hour"] = time.hour
facebook_data["weekday"] = time.weekday
  
  
# 2.3 去掉签到较少的中央
  
  
place_count = facebook_data.groupby("place_id").count()
place_count = place_count[place_count["row_id"]>3]
facebook_data = facebook_data[facebook_data["place_id"].isin(place_count.index)]
  
  
# 2.4 确定特征值和目标值
  
  
x = facebook_data[["x", "y", "accuracy", "day", "hour", "weekday"]]
y = facebook_data["place_id"]
  
  
# 2.5 宰割数据集
  
  
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22)
  • 特色工程 – 特色预处理(标准化)
  
  
# 3. 特色工程 -- 特色预处理(标准化)
  
  
  
  
# 3.1 实例化一个转换器
  
  
transfer = StandardScaler()
  
  
# 3.2 调用 fit_transform
  
  
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)
  • 机器学习 –knn+cv
  
  
# 4. 机器学习 --knn+cv
  
  
  
  
# 4.1 实例化一个预计器
  
  
estimator = KNeighborsClassifier()
  
  
# 4.2 调用 gridsearchCV
  
  
param_grid = {"n_neighbors": [1, 3, 5, 7, 9]}
estimator = GridSearchCV(estimator, param_grid=param_grid, cv=5)
  
  
# 4.3 模型训练
  
  
estimator.fit(x_train, y_train)
  • 模型评估
  
  
# 5. 模型评估
  
  
  
  
# 5.1 根本评估形式
  
  
score = estimator.score(x_test, y_test)
print("最初预测的准确率为:\n", score)

y_predict = estimator.predict(x_test)
print("最初的预测值为:\n", y_predict)
print("预测值和实在值的比照状况:\n", y_predict == y_test)

  
  
# 5.2 应用穿插验证后的评估形式
  
  
print("在穿插验证中验证的最好后果:\n", estimator.best_score_)
print("最好的参数模型:\n", estimator.best_estimator_)
print("每次穿插验证后的验证集准确率后果和训练集准确率后果:\n",estimator.cv_results_)

未完待续,同学们请期待下一期

全套笔记和代码自取移步 gitee 仓库:gitee 仓库获取残缺文档和代码

感兴趣的小伙伴能够自取哦,欢送大家点赞转发~

正文完
 0