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

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

3 波士顿房价预测


from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge
from sklearn.metrics import mean_squared_error
def linner1():
    """
    正规方程的优化方法
    :return:
    """
    # 1)获取数据
    boston = load_boston()
    # 2)划分数据集
    x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22)
    # 3)标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    # 4)预估器
    estimator = LinearRegression()
    estimator.fit(x_train, y_train)
    # 5)得出模型
    print("正规方程权重系数为:\n", estimator.coef_)
    print("正规方程偏置为:\n", estimator.intercept_)
    # 6)模型评估
    y_predict = estimator.predict(x_test)
    print("预测房价:\n", y_predict)
    error = mean_squared_error(y_test, y_predict)
    print("正规方程-均分误差为:\n", error)
    return None
def linner2():
    """
    梯度下降的优化方法
    :return:
    """
    # 1)获取数据
    boston = load_boston()
    print("特征数量:\n", boston.data.shape)  # 几个特征对应几个权重系数
    # 2)划分数据集
    x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22)
    # 3)标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    # 4)预估器
    estimator = SGDRegressor(learning_rate="constant", eta0=0.001, max_iter=10000)
    estimator.fit(x_train, y_train)
    # 5)得出模型
    print("梯度下降权重系数为:\n", estimator.coef_)
    print("梯度下降偏置为:\n", estimator.intercept_)
    # 6)模型评估
    y_predict = estimator.predict(x_test)
    print("预测房价:\n", y_predict)
    error = mean_squared_error(y_test, y_predict)
    print("梯度下降-均分误差为:\n", error)
    return None
def linner3():
    """
    岭回归
    :return:
    """
    # 1)获取数据
    boston = load_boston()
    print("特征数量:\n", boston.data.shape)  # 几个特征对应几个权重系数
    # 2)划分数据集
    x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22)
    # 3)标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    # 4)预估器
    estimator = Ridge(alpha=0.5, max_iter=10000)  # 可默认参数
    estimator.fit(x_train, y_train)
    # 5)得出模型
    print("岭回归-权重系数为:\n", estimator.coef_)
    print("岭回归-下降偏置为:\n", estimator.intercept_)
    # 6)模型评估
    y_predict = estimator.predict(x_test)
    print("预测房价:\n", y_predict)
    error = mean_squared_error(y_test, y_predict)
    print("岭回归-均分误差为:\n", error)
    return None
if __name__ == '__main__':
    linner1()
    linner2()
    linner3()



4.4 分类算法–逻辑回归与二分类


学习目标:


  • 说明逻辑回归的损失函数


  • 说明逻辑回归的优化方法


  • 说明sigmoid函数


  • 知道逻辑回归的应用场景


  • 知道精确率、召回率指标的区别


  • 知道F-score指标说明召回率的实际意义


  • 说明如何解决样本不均衡情况下的评估


  • 了解ROC曲线的意义,说明AUC指标大小


  • 应用classificiation_report实现精确率、召回率计算


  • 应用roc_auc_score实现指标计算


4.4.1 逻辑回归的应用场景


  • 广告点击率:是否会被点击


  • 是否为垃圾邮件


  • 是否患病


  • 金融诈骗


  • 虚假账号


  • 以上都是二分类(正例,反例),逻辑回归就是解决二分类的利器


4.4.2 逻辑回归的原理



线性回归的输出就是逻辑回归的输入





3 损失以及优化




2 优化


同样使用梯度下降优化算法,去减少损失函数的值。这样去更新逻辑回归前面对应算法的权重参数,提升原本属于1类别的概率,降低原本是0类别的概率


4.4.3 逻辑回归API


sklearn.linear_model.LogisticRefression(solver='liblinear', penalty='l2, C=1.0)


  • penalty:正则化种类


  • C:正则化力度


  • solver:优化求解方式(默认开源的liblinear库实现)



4.4.4 案例:癌症分类预测-良/恶性乳腺癌肿瘤预测



流程分析:


1)获取数据:读取的时候加上names


2)数据处理:处理缺失值


3)数据集划分


4)特征工程:无量纲化处理—标准化


5)逻辑回归预估器


6)模型评估


import pandas as pd
import numpy as np
# 1、读取数据
path = "https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data"
column_name = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape',
                   'Marginal Adhesion', 'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin',
                   'Normal Nucleoli', 'Mitoses', 'Class']
data = pd.read_csv(path, names=column_name)  #699 rows × 11 columns
# 2、缺失值处理
# 1)替换-》np.nan
data = data.replace(to_replace="?", value=np.nan)
# 2)删除缺失样本
data.dropna(inplace=True)  #683 rows × 11 columns
# 3、划分数据集
from sklearn.model_selection import train_test_split
# 筛选特征值和目标值
x = data.iloc[:, 1:-1]
y = data["Class"]
x_train, x_test, y_train, y_test = train_test_split(x, y)
# 4、标准化
from sklearn.preprocessing import StandardScaler
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
from sklearn.linear_model import LogisticRegression
# 5、预估器流程
estimator = LogisticRegression()
estimator.fit(x_train, y_train)
# 逻辑回归的模型参数:回归系数和偏置
estimator.coef_   # 权重
estimator.intercept_  # 偏置
# 6、模型评估
# 方法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)


4.4.5 分类的评估方法


1 精确率与召回率


1 混淆矩阵


真的患癌症的,能够被检查出来的概率



2 精确率(Precision)与召回率(Recall)





3 分类评估报告API


sklearn.metrics.classification_report(y_true, y_pred, labels=[], target_names=None)


  • y_true:真实目标值


  • y_pred:估计器预测目标值


  • labels:指定类别对应的数字


  • target_names:目标类别名称


  • return:每个类别精确率与召回率


# 查看精确率、召回率、F1-score
from sklearn.metrics import classification_report
report = classification_report(y_test, y_predict, labels=[2, 4], target_names=["良性", "恶性"])




衡量样本不均衡下的评估:


2 ROC曲线与AUC指标


TPR就是召回率





4 AUC计算API


from sklearn.metrics import roc_auc_score
roc_auc_score(y_true, y_score)


  • y_true:每个样本的真实类别,必须为0(反例)和1(正例)


  • y_score:预测得分,可以是正类的估计概率、置信值或者分类器方法的返回值


# y_true:每个样本的真实类别,必须为0(反例),1(正例)标记
# 将y_test 转换成 0 1
y_true = np.where(y_test > 3, 1, 0)
from sklearn.metrics import roc_auc_score
roc_auc_score(y_true, y_predict)



5 总结


  • AUC只能用来评价二分类


  • AUC非常适合评价样本在不平衡中的分类器性能


4.5 模型保存和加载


学习目标:


  • 应用joblib实现模型的保存于加载


4.5.1 模型的保存和加载API


import joblib


  • 保存:joblib.dump(rf, ‘test.pkl’)


  • 加载:estimator = joblib.load(‘test.pkl’)


4.5.2 线性回归的模型保存加载案例


1、保存模型



2、加载模型



4.6 无监督学习:K-means算法


学习目标:


  • 说明K-means算法原理


  • 说明K-means的性能评估标准轮廓系数


  • 说明K-means的优缺点


什么是无监督学习


没有目标值(无标签)—无监督学习



4.6.2 无监督学习包含算法


聚类:K-means


降维:PCA


4.6.3 K-means原理



4.6.4 K-means API


sklearn.cluster.KMeans(n_cluster=8, init='k-means++')


  • n_clusters:开始聚类中心数量


  • init:初始化方法,默认为‘k-means++’


  • labels_:默认标记的类型,可以和真实值比较(不是值比较)


from sklearn.cluster import KMeans
estimator = KMeans(n_clusters=3)
estimator.fit(data_new)
y_predict = estimator.predict(data_new)



4.6.5 案例:k-means对instacart Market用户聚类


1 分析


  • 1)降维之后的数据


  • 2)预估器流程:k-means聚类


  • 3)聚类结果显示


  • 4)模型评估


4.6.6 K-means性能评估指标


1 轮廓系数



2 轮廓系数值分析



3 结论



4 轮廓系数API


sklearn.metrics.silhouette_score(X, labels)


  • 计算所有样本的平均轮廓系数


  • X:特征值


  • labels:被聚类标记的目标值


from  sklearn.metrics import silhouette_score
silhouette_score(data_new, y_predict)



4.6.7 K-means总结


特点分析:采用迭代式算法,直观易懂并且非常实用


缺点:容易收敛到局部最优解(多次聚类)


注意:聚类一般坐在分类之前



目录
相关文章
|
1月前
|
数据采集 Web App开发 数据可视化
Python爬虫教程:Selenium可视化爬虫的快速入门
Python爬虫教程:Selenium可视化爬虫的快速入门
|
5月前
|
缓存 监控 程序员
Python中的装饰器是一种特殊类型的声明,它允许程序员在不修改原有函数或类代码的基础上,通过在函数定义前添加额外的逻辑来增强或修改其行为。
【6月更文挑战第30天】Python装饰器是无侵入性地增强函数行为的工具,它们是接收函数并返回新函数的可调用对象。通过`@decorator`语法,可以在不修改原函数代码的情况下,添加如日志、性能监控等功能。装饰器促进代码复用、模块化,并保持源代码整洁。例如,`timer_decorator`能测量函数运行时间,展示其灵活性。
49 0
|
2月前
|
算法 程序员 Python
程序员必看!Python复杂度分析全攻略,让你的算法设计既快又省内存!
在编程领域,Python以简洁的语法和强大的库支持成为众多程序员的首选语言。然而,性能优化仍是挑战。本文将带你深入了解Python算法的复杂度分析,从时间与空间复杂度入手,分享四大最佳实践:选择合适算法、优化实现、利用Python特性减少空间消耗及定期评估调整,助你写出高效且节省内存的代码,轻松应对各种编程挑战。
41 1
|
3月前
|
设计模式 JSON 程序员
豆瓣评分9.4!Python程序员必读的《流畅的Python》,放这里了!
Python 官方教程的开头是这样写的:“Python 是一门既容易上手又强大的编程语言。””这句话本身并无大碍,但需要注意的是,正因为它既好学又好用,所以很多Python程序员只用到了其强大功能的一小部分,只需要几个小时,经验丰富的程序员就能学会用 Python 写出实用的程序。 然而随着这最初高产的几个小时变成数周甚至数月,在那些先入为主的编程语言的影响下,开发者们会慢慢地写出带着“口音”的 Python 代码。即便 Python 是你的初恋,也难逃此命运。因为在学校里,亦或是那些入门书上,教授者往往会有意避免只跟语言本身相关的特性。
|
3月前
|
设计模式 JSON 程序员
豆瓣评分9.4!Python程序员必读的《流畅的Python》,放这里了!
Python 官方教程的开头是这样写的:“Python 是一门既容易上手又强大的编程语言。””这句话本身并无大碍,但需要注意的是,正因为它既好学又好用,所以很多Python程序员只用到了其强大功能的一小部分,只需要几个小时,经验丰富的程序员就能学会用 Python 写出实用的程序。 然而随着这最初高产的几个小时变成数周甚至数月,在那些先入为主的编程语言的影响下,开发者们会慢慢地写出带着“口音”的 Python 代码。即便 Python 是你的初恋,也难逃此命运。因为在学校里,亦或是那些入门书上,教授者往往会有意避免只跟语言本身相关的特性。
|
3月前
|
程序员 Python
[oeasy]python0028_女性程序员_Eniac_girls_bug_Grace
回顾上次内容,我们了解到 `.py` 文件中的代码是按顺序一行行被解释执行的,可以使用 `pdb3 hello.py` 来调试程序。此外,我们探讨了“bug”这一术语的由来,它最早是在 1947 年由 Grace Murray Hopper 发现的一只真正的飞蛾所引起的计算机故障,从此“debugging”成了查找并修复程序错误的过程。早期的程序员大多为女性,因为她们通常更加细心且有耐心,这些特质对于检查错综复杂的线路和编程工作至关重要。编程与编织有着相似之处,都需要细致和有条理的操作。最后,我们认识到 bug 的存在是程序员工作的基础,没有 bug 就不需要程序员去修正它们。
41 3
|
4月前
|
网络协议 关系型数据库 数据挖掘
python小白快速入门教程
Python是一种解释型、面向对象、动态数据类型的高级编程语言。
53 1
|
3月前
|
存储 JSON 程序员
Python文件操作与数据持久化:强大功能简化存储管理,助力程序员高效实现业务逻辑
【8月更文挑战第6天】数据是现代计算机程序的核心,但其存储与管理常常构成开发挑战。Python凭借其强大的文件操作与数据持久化机制,显著提升了编程效率。Python的文件处理简单直观,通过内置`open`函数即可轻松实现文本或二进制文件的读写。例如,仅需几行代码就能完成文本写入。此外,Python支持多种数据持久化方案,如文本文件、CSV、JSON及数据库操作。利用内置`json`模块,可以便捷地进行JSON数据的序列化与反序列化,实现数据的有效存储与检索。这些特性使得Python成为数据管理和存储的理想选择,让开发者能够更加专注于业务逻辑的实现。
43 0
|
4月前
|
存储 大数据 程序员
逆袭吧,程序员!Python堆与优先队列的使用秘籍,助你轻松解决复杂问题!
【7月更文挑战第9天】Python的堆和优先队列是高效工具,对比列表在删除最小元素时的O(n)复杂度,堆提供O(log n)操作。优先队列利用堆数据结构,按优先级处理元素,而非FIFO。示例中,heapq模odule创建最小堆实现任务优先级执行,显示了其在解决复杂问题时的威力,助力程序员提升效率,实现编程挑战的逆袭。
47 2

热门文章

最新文章