黑马程序员---三天快速入门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 什么是朴素贝叶斯算法




类别结果为概率大的

目录
相关文章
|
7天前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
37 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
7天前
|
机器学习/深度学习 算法 数据挖掘
Python数据分析革命:Scikit-learn库,让机器学习模型训练与评估变得简单高效!
在数据驱动时代,Python 以强大的生态系统成为数据科学的首选语言,而 Scikit-learn 则因简洁的 API 和广泛的支持脱颖而出。本文将指导你使用 Scikit-learn 进行机器学习模型的训练与评估。首先通过 `pip install scikit-learn` 安装库,然后利用内置数据集进行数据准备,选择合适的模型(如逻辑回归),并通过交叉验证评估其性能。最终,使用模型对新数据进行预测,简化整个流程。无论你是新手还是专家,Scikit-learn 都能助你一臂之力。
47 8
|
3天前
|
算法 程序员 Python
程序员必看!Python复杂度分析全攻略,让你的算法设计既快又省内存!
在编程领域,Python以简洁的语法和强大的库支持成为众多程序员的首选语言。然而,性能优化仍是挑战。本文将带你深入了解Python算法的复杂度分析,从时间与空间复杂度入手,分享四大最佳实践:选择合适算法、优化实现、利用Python特性减少空间消耗及定期评估调整,助你写出高效且节省内存的代码,轻松应对各种编程挑战。
14 1
|
4天前
|
机器学习/深度学习 数据可视化 数据挖掘
数据可视化大不同!Python数据分析与机器学习中的Matplotlib、Seaborn应用新视角!
在数据科学与机器学习领域,数据可视化是理解数据和优化模型的关键。Python凭借其强大的可视化库Matplotlib和Seaborn成为首选语言。本文通过分析一份包含房屋面积、卧室数量等特征及售价的数据集,展示了如何使用Matplotlib绘制散点图,揭示房屋面积与售价的正相关关系;并利用Seaborn的pairplot探索多变量间的关系。在机器学习建模阶段,通过随机森林模型展示特征重要性的可视化,帮助优化模型。这两个库在数据分析与建模中展现出广泛的应用价值。
17 2
|
9天前
|
机器学习/深度学习 存储 人工智能
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
使用Python作为开发语言,基于文本数据集(一个积极的xls文本格式和一个消极的xls文本格式文件),使用Word2vec对文本进行处理。通过支持向量机SVM算法训练情绪分类模型。实现对文本消极情感和文本积极情感的识别。并基于Django框架开发网页平台实现对用户的可视化操作和数据存储。
19 0
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
|
19天前
|
机器学习/深度学习 算法 Python
从菜鸟到大师:一棵决策树如何引领你的Python机器学习之旅
【9月更文挑战第9天】在数据科学领域,机器学习如同璀璨明珠,吸引无数探索者。尤其对于新手而言,纷繁复杂的算法常让人感到迷茫。本文将以决策树为切入点,带您从Python机器学习的新手逐步成长为高手。决策树以其直观易懂的特点成为入门利器。通过构建决策树分类器并应用到鸢尾花数据集上,我们展示了其基本用法及效果。掌握决策树后,还需深入理解其工作原理,调整参数,并探索集成学习方法,最终将所学应用于实际问题解决中,不断提升技能。愿这棵智慧之树助您成为独当一面的大师。
23 3
|
9天前
|
机器学习/深度学习 数据采集 算法
机器学习新纪元:用Scikit-learn驾驭Python,精准模型选择全攻略!
在数据爆炸时代,机器学习成为挖掘数据价值的关键技术,而Scikit-learn作为Python中最受欢迎的机器学习库之一,凭借其丰富的算法集、简洁的API和高效性能,引领着机器学习的新纪元。本文通过一个实际案例——识别垃圾邮件,展示了如何使用Scikit-learn进行精准模型选择。从数据预处理、模型训练到交叉验证和性能比较,最后选择最优模型进行部署,详细介绍了每一步的操作方法。通过这个过程,我们不仅可以看到如何利用Scikit-learn的强大功能,还能了解到模型选择与优化的重要性。希望本文能为你的机器学习之旅提供有价值的参考。
11 0
|
18天前
|
机器学习/深度学习 人工智能 TensorFlow
神经网络入门到精通:Python带你搭建AI思维,解锁机器学习的无限可能
【9月更文挑战第10天】神经网络是开启人工智能大门的钥匙,不仅是一种技术,更是模仿人脑思考的奇迹。本文从基础概念入手,通过Python和TensorFlow搭建手写数字识别的神经网络,逐步解析数据加载、模型定义、训练及评估的全过程。随着学习深入,我们将探索深度神经网络、卷积神经网络等高级话题,并掌握优化模型性能的方法。通过不断实践,你将能构建自己的AI系统,解锁机器学习的无限潜能。
14 0
|
1天前
|
存储 人工智能 数据挖掘
Python编程入门:从基础到实战
【9月更文挑战第26天】 在这篇文章中,我们将一起探索Python编程的奇妙世界。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供有价值的信息和技巧。我们将从Python的基本语法开始,然后逐步深入到更复杂的主题,如函数、类和模块。最后,我们将通过一个实际的项目来应用我们所学的知识。让我们一起开始这段Python编程之旅吧!
|
2天前
|
数据采集 人工智能 数据挖掘
Python编程入门:从基础到实战的快速指南
【9月更文挑战第25天】本文旨在为初学者提供一个简明扼要的Python编程入门指南。通过介绍Python的基本概念、语法规则以及实际案例分析,帮助读者迅速掌握Python编程的核心技能。文章将避免使用复杂的专业术语,而是采用通俗易懂的语言和直观的例子来阐述概念,确保内容的可读性和实用性。