黑马程序员---三天快速入门Python机器学习(第二天)(上)

简介: 黑马程序员---三天快速入门Python机器学习(第二天)

三、分类算法


3.1 sklearn转换器和估计器


学习目标:


  • 知道sklearn的转换器和估计器流程


3.1.1 转换器


  1. 实例化一个转换器类


  1. 调用fit_transform()


转换器调用有以下几种形式:


  • fit_transform


  • fit


  • transform


3.1.2 估计器(sklearn机器学习算法的实现)


在sklearn中,估计器是一个重要的角色,是一类实现了算法的API


1、用于分类的估计器:


  • 1)sklearn.neighbors k近邻算法


  • 2)sklearn.native_bayes 贝叶斯


  • 3)sklearn.linear_model.LogisticRegression 逻辑回归


  • 4)sklearn.tree 决策树与随机森林


2、用于回归的估计器


  • 1)sklearn.linear_model.LinearRegression 线性回归


  • 2)sklearn.linear_model.Ridge 岭回归


3、用于无监督学习的估计器


  • 1)sklearn.cluster.KMeans 聚类


估计器工作流程



估计器(estimator):


  • 1、实例化一个estimator


  • 2、estimator.fit(x_train, y_train)计算


  • -----调用完毕,模型生成


  • 3、模型评估:


  • 1)直接比对真实值和预测值:y_predict = estimator.predict(x_test)


  • 2)计算准确率:accuracy = estimator.score(x_test, y_test)


3.2 K-近邻算法


学习目标:


  • 说明K-近邻算法的距离公式


  • 说明K-近邻算法的超参数K值以及取值问题


  • 说明K-近邻算法的优缺点


  • 应用K-近邻实现分类


3.2.1 什么是K-近邻算法(KNN)



根据你的邻居来推断你的类别


1、K-近邻算法原理


定义:如果一个样本在特征空间总的K个最相近的特征空间中最邻近的样本中的大多数属于某一个类别,则该样本也属于这个类别


如何确定谁是邻居?


计算距离公式:


1)欧式距离



2)曼哈顿距离:绝对值距离


3)明可夫斯基距离


2、电影类型分析



计算距离如下:



K=1时,离第二个电影近,属于爱情片


K=2时,离第二、三部电影近,属于爱情片


K=6时,无法确定


K值过大,容易受到样本不均衡的影响


K值过小,容易受到异常值影响


3.2.2 K-近邻算法API


sklearn.neighbor.KNeighborsClassifier(n_neighbors=5, algorithm='auto')


  • n_neighbors:int型,k_neighbors查询默认使用的邻居数


  • algorithm:{‘auto’,‘ball_tree’,‘kd_tree’}之一


3.2.3 案例1:鸢尾花种类预测



流程:


1)获取数据


2)数据集划分


3)特征工程:标准化


4)KNN预估器流程


5)模型评估


from sklearn.datasets import load_iris                  # 获取数据集
from sklearn.model_selection import train_test_split    # 划分数据集
from sklearn.preprocessing import StandardScaler        # 标准化
from sklearn.neighbors import KNeighborsClassifier      # KNN算法分类
def knn_iris():
    """
    用KNN算法对鸢尾花进行分类
    :return:
    """
    # 1、获取数据
    iris = load_iris()
    # 2、划分数据集
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=6)
    # 3、特征工程:标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)  # 训练集标准化
    x_test = transfer.transform(x_test)        # 测试集标准化
    # 4、KNN算法预估器
    estimator = KNeighborsClassifier(n_neighbors=3)
    estimator.fit(x_train, y_train)
    # 5、模型评估
    # 方法1:直接比对真实值和预测值
    y_predict = estimator.predict(x_test)
    print("y_predict:\n", y_predict)
    print("直接必读真实值和预测值:\n", y_test == y_predict)  # 直接比对
    # 方法2:计算准确率
    score = estimator.score(x_test, y_test)  # 测试集的特征值,测试集的目标值
    print("准确率:\n", score)
    return None
if __name__ == "__main__":
    knn_iris()


y_predict:
 [0 2 0 0 2 1 1 0 2 1 2 1 2 2 1 1 2 1 1 0 0 2 0 0 1 1 1 2 0 1 0 1 0 0 1 2 1
 2]
直接必读真实值和预测值:
 [ True  True  True  True  True  True False  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 False  True
  True  True]
准确率:
 0.9210526315789473


3.2.4 K-近邻总结


优点:简单,易于实现,无需训练


缺点:懒惰算法,对测试样本分类时的计算量大,内存开销大;必须指定K值,K值选择不当则分类精度不能保证


使用场景:小数据场景,几千~几万样本


3.3 模型选择与调优


学习目标:


  • 说明交叉验证过程


  • 说明超参数搜索过程


  • 应用GridSearchCV实现算法参数的调优


应用:


  • 鸢尾花数据集预测


  • Facebook签到位置预测调优


3.3.1 什么是交叉验证(cross validation)


交叉验证:将拿到的训练集数据,分为训练和验证集以下图为例:将数据分成4份,其中一份作为验证集。然后经过4次的测试,每次都更换不同的验证集。即得到4组模型的结果,取平均值作为最终结果,又称4折交叉验证。



为什么需要交叉验证


交叉验证的目的:为了让被评估的模型更加准确可信


3.3.2 超参数搜索—网格搜索(Grid Search)


通常情况下,很多参数是需要手动指定的(如K-近邻算法中的K值),这种叫超参数。

但是手动过程繁杂,所以需要对模型预设几种超参数组合。每组超参数都采用交叉验证来进行评估。最后选出最优参数组合建立模型



模型选择与调优API


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


  • 对估计器的指定参数进行详尽搜索


  • estimator:估计器对象


  • param_grid:估计器参数(dict){“n_neighbors”:[1,3,5]}


  • cv:指定几折交叉验证


  • fit():输入训练数据


  • score():准确率


结果分析:


  • 最佳参数:best_params_


  • 最佳结果:best_score_


  • 最佳估计器:best_estimator_


  • 交叉验证结果:cv_results_


3.3.3 鸢尾花案例增加K值调优


from sklearn.datasets import load_iris                  # 获取数据集
from sklearn.model_selection import train_test_split    # 划分数据集
from sklearn.preprocessing import StandardScaler        # 标准化
from sklearn.neighbors import KNeighborsClassifier      # KNN算法分类
from sklearn.model_selection import GridSearchCV
def knn_iris_gscv():
    """
    用KNN算法对鸢尾花进行分类
    添加网格搜索和交叉验证
    :return:
    """
    # 1、获取数据
    iris = load_iris()
    # 2、划分数据集
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=6)
    # 3、特征工程:标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)  # 训练集标准化
    x_test = transfer.transform(x_test)        # 测试集标准化
    # 4、KNN算法预估器
    estimator = KNeighborsClassifier()
    # 加入网格搜索与交叉验证
    # 参数准备
    param_dict = {"n_neighbors": [1,3,5,7,9,11]}
    estimator = GridSearchCV(estimator, param_grid=param_dict, cv=10)  # 10折,数据量不大,可以多折
    estimator.fit(x_train, y_train)
    # 5、模型评估
    # 方法1:直接比对真实值和预测值
    y_predict = estimator.predict(x_test)
    print("y_predict:\n", y_predict)
    print("直接必读真实值和预测值:\n", y_test == y_predict)  # 直接比对
    # 方法2:计算准确率
    score = estimator.score(x_test, y_test)  # 测试集的特征值,测试集的目标值
    print("准确率:", score)
    # 查看最佳参数:best_params_
    print("最佳参数:", estimator.best_params_)
    # 最佳结果:best_score_
    print("最佳结果:", estimator.best_score_)
    # 最佳估计器:best_estimator_
    print("最佳估计器:", estimator.best_estimator_)
    # 交叉验证结果:cv_results_
    print("交叉验证结果:", estimator.cv_results_)
    return None
if __name__ == "__main__":
    knn_iris_gscv()


y_predict:
 [0 2 0 0 2 1 2 0 2 1 2 1 2 2 1 1 2 1 1 0 0 2 0 0 1 1 1 2 0 1 0 1 0 0 1 2 1
 2]
直接必读真实值和预测值:
 [ True  True  True  True  True  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 False  True
  True  True]
准确率: 0.9473684210526315
最佳参数: {'n_neighbors': 11}
最佳结果: 0.9734848484848484
最佳估计器: KNeighborsClassifier(n_neighbors=11)
交叉验证结果: {'mean_fit_time': array([0.00079339, 0.00080094, 0.0009928 , 0.0006006 , 0.00070167,
       0.00070193]), 'std_fit_time': array([0.0003968 , 0.00059903, 0.00076554, 0.00049046, 0.00045943,
       0.00078134]), 'mean_score_time': array([0.00129824, 0.00139394, 0.00149796, 0.0011945 , 0.00168662,
       0.00189412]), 'std_score_time': array([0.00045802, 0.00091274, 0.00066832, 0.00039337, 0.00117739,
       0.00070156]), 'param_n_neighbors': masked_array(data=[1, 3, 5, 7, 9, 11],
             mask=[False, False, False, False, False, False],
       fill_value='?',
            dtype=object), 'params': [{'n_neighbors': 1}, {'n_neighbors': 3}, {'n_neighbors': 5}, {'n_neighbors': 7}, {'n_neighbors': 9}, {'n_neighbors': 11}], 'split0_test_score': array([1., 1., 1., 1., 1., 1.]), 'split1_test_score': array([0.91666667, 0.91666667, 1.        , 0.91666667, 0.91666667,
       0.91666667]), 'split2_test_score': array([1., 1., 1., 1., 1., 1.]), 'split3_test_score': array([1.        , 1.        , 1.        , 1.        , 0.90909091,
       1.        ]), 'split4_test_score': array([1., 1., 1., 1., 1., 1.]), 'split5_test_score': array([0.90909091, 0.90909091, 1.        , 1.        , 1.        ,
       1.        ]), 'split6_test_score': array([1., 1., 1., 1., 1., 1.]), 'split7_test_score': array([0.90909091, 0.90909091, 0.90909091, 0.90909091, 1.        ,
       1.        ]), 'split8_test_score': array([1., 1., 1., 1., 1., 1.]), 'split9_test_score': array([0.90909091, 0.81818182, 0.81818182, 0.81818182, 0.81818182,
       0.81818182]), 'mean_test_score': array([0.96439394, 0.95530303, 0.97272727, 0.96439394, 0.96439394,
       0.97348485]), 'std_test_score': array([0.04365767, 0.0604591 , 0.05821022, 0.05965639, 0.05965639,
       0.05742104]), 'rank_test_score': array([5, 6, 2, 3, 3, 1])}


3.2.4 案例:预测facebook签到位置



流程分析:


1)获取数据


2)数据处理


目的:


  • 特征值 x:2<x<2.5


  • 目标值y:1.0<y<1.5


  • time -> 年与日时分秒


  • 过滤签到次数少的地点


3)特征工程:标准化


4)KNN算法预估流程


5)模型选择与调优


6)模型评估


import pandas as pd
# 1、获取数据
data = pd.read_csv("./FBlocation/train.csv") #29118021 rows × 6 columns
# 2、基本的数据处理
# 1)缩小数据范围
data = data.query("x<2.5 & x>2 & y<1.5 & y>1.0") #83197 rows × 6 columns
# 2)处理时间特征
time_value = pd.to_datetime(data["time"], unit="s") #Name: time, Length: 83197
date = pd.DatetimeIndex(time_value)
data["day"] = date.day
data["weekday"] = date.weekday
data["hour"] = date.hour
data.head() #83197 rows × 9 columns
# 3)过滤签到次数少的地点
place_count = data.groupby("place_id").count()["row_id"]  #2514 rows × 8 columns
place_count[place_count > 3].head()
data_final = data[data["place_id"].isin(place_count[place_count>3].index.values)]
data_final.head() #80910 rows × 9 columns
# 筛选特征值和目标值
x = data_final[["x", "y", "accuracy", "day", "weekday", "hour"]]
y = data_final["place_id"]
# 数据集划分
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y)
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV
# 3、特征工程:标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)  # 训练集标准化
x_test = transfer.transform(x_test)        # 测试集标准化
# 4、KNN算法预估器
estimator = KNeighborsClassifier()
# 加入网格搜索与交叉验证
# 参数准备
param_dict = {"n_neighbors": [3,5,7,9]}
estimator = GridSearchCV(estimator, param_grid=param_dict, cv=5)  # 10折,数据量不大,可以多折
estimator.fit(x_train, y_train)
# 5、模型评估
# 方法1:直接比对真实值和预测值
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("直接必读真实值和预测值:\n", y_test == y_predict)  # 直接比对
# 方法2:计算准确率
score = estimator.score(x_test, y_test)  # 测试集的特征值,测试集的目标值
print("准确率:", score)
# 查看最佳参数:best_params_
print("最佳参数:", estimator.best_params_)
# 最佳结果:best_score_
print("最佳结果:", estimator.best_score_)
# 最佳估计器:best_estimator_
print("最佳估计器:", estimator.best_estimator_)
# 交叉验证结果:cv_results_
print("交叉验证结果:", estimator.cv_results_)


3.4 朴素贝叶斯算法


学习目标:


  • 说明条件概率与联合概率


  • 说明贝叶斯公式,以及特征独立的关系


  • 记忆贝叶斯公式


  • 知道拉普拉斯平滑系数


  • 应用贝叶斯公式实现概率的计算


3.4.1 什么是朴素贝叶斯算法




类别结果为概率大的

目录
相关文章
|
4天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
19 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
7天前
|
机器学习/深度学习 数据采集 人工智能
探索机器学习:从理论到Python代码实践
【10月更文挑战第36天】本文将深入浅出地介绍机器学习的基本概念、主要算法及其在Python中的实现。我们将通过实际案例,展示如何使用scikit-learn库进行数据预处理、模型选择和参数调优。无论你是初学者还是有一定基础的开发者,都能从中获得启发和实践指导。
17 2
|
8天前
|
机器学习/深度学习 数据采集 搜索推荐
利用Python和机器学习构建电影推荐系统
利用Python和机器学习构建电影推荐系统
23 1
|
8天前
|
机器学习/深度学习 算法 PyTorch
用Python实现简单机器学习模型:以鸢尾花数据集为例
用Python实现简单机器学习模型:以鸢尾花数据集为例
25 1
|
15天前
|
机器学习/深度学习 数据采集 算法
Python机器学习:Scikit-learn库的高效使用技巧
【10月更文挑战第28天】Scikit-learn 是 Python 中最受欢迎的机器学习库之一,以其简洁的 API、丰富的算法和良好的文档支持而受到开发者喜爱。本文介绍了 Scikit-learn 的高效使用技巧,包括数据预处理(如使用 Pipeline 和 ColumnTransformer)、模型选择与评估(如交叉验证和 GridSearchCV)以及模型持久化(如使用 joblib)。通过这些技巧,你可以在机器学习项目中事半功倍。
21 3
|
19天前
|
机器学习/深度学习 人工智能 算法
机器学习基础:使用Python和Scikit-learn入门
机器学习基础:使用Python和Scikit-learn入门
26 1
|
25天前
|
机器学习/深度学习 算法 Java
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
|
4天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。
|
4天前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!
|
4天前
|
存储 Python
Python编程入门:打造你的第一个程序
【10月更文挑战第39天】在数字时代的浪潮中,掌握编程技能如同掌握了一门新时代的语言。本文将引导你步入Python编程的奇妙世界,从零基础出发,一步步构建你的第一个程序。我们将探索编程的基本概念,通过简单示例理解变量、数据类型和控制结构,最终实现一个简单的猜数字游戏。这不仅是一段代码的旅程,更是逻辑思维和问题解决能力的锻炼之旅。准备好了吗?让我们开始吧!

热门文章

最新文章