机器学习入门实例-加州房价预测-1(数据准备与可视化)

news2025/9/20 10:28:56

问题描述

数据来源:California Housing Prices dataset from the StatLib repository,1990年加州的统计数据。

要求:预测任意一个街区的房价中位数

缩小问题:superwised multiple regressiong(用到人口、收入等特征) univariate regression(只预测一个数据)plain batch learning(数据量不大+不咋变动)

准备数据

下载数据

可以去github,也可以自动下载。

import os
import tarfile
import urllib.request
import pandas as pd

down_root = "https://raw.githubusercontent.com/ageron/handson-ml2/master/"
HOUSING_PATH = "datasets"
HOUSING_URL = down_root + "datasets/housing/housing.tgz"

def fetch_housing_data(housing_url=HOUSING_URL, housing_path=HOUSING_PATH):
    tgz_path = os.path.join(housing_path, "housing.tgz")
    urllib.request.urlretrieve(housing_url, tgz_path)
    housing_tgz = tarfile.open(tgz_path)
    housing_tgz.extractall(path=housing_path)
    housing_tgz.close()

查看数据

def load_housing_data(housing_path=HOUSING_PATH):
    csv_path = os.path.join(housing_path, "housing.csv")
    return pd.read_csv(csv_path)

housing = load_housing_data()
# housing.head() 默认打印前5行信息,中间列可能省略
# housing.info() 打印行列信息、类型等

housing.info()可以简单查看数据情况。可以看到,total_bedrooms里有数据缺失,而ocean_proximity的类型是object。因为文件是csv格式,所以肯定是字符串类型。

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 20640 entries, 0 to 20639
Data columns (total 10 columns):
 #   Column              Non-Null Count  Dtype  
---  ------              --------------  -----  
 0   longitude           20640 non-null  float64
 1   latitude            20640 non-null  float64
 2   housing_median_age  20640 non-null  float64
 3   total_rooms         20640 non-null  float64
 4   total_bedrooms      20433 non-null  float64
 5   population          20640 non-null  float64
 6   households          20640 non-null  float64
 7   median_income       20640 non-null  float64
 8   median_house_value  20640 non-null  float64
 9   ocean_proximity     20640 non-null  object 
dtypes: float64(9), object(1)
memory usage: 1.6+ MB
None

打印一下ocean_proximity的分类及统计,可以看到是标签,category

print(housing["ocean_proximity"].value_counts())

<1H OCEAN     9136
INLAND        6551
NEAR OCEAN    2658
NEAR BAY      2290
ISLAND           5
Name: ocean_proximity, dtype: int64

housing.describe()可以计算各个数值列的count,mean,std,min,25%、50%和75%(中位数)、max。计算时null会被忽略。

也可以通过绘制柱形图观察数据。

import matplotlib.pyplot as plt
housing.hist(bins=50, figsize=(20,15))
plt.show()

在这里插入图片描述
要看柱形图是因为某些机器学习算法更适合用正态数据,如果是tail-heavy(左偏)需要通过一些方法修正。

划分测试集与训练集

最简单的是直接随机挑选。但是要设置seed,因为如果不设置的话,每次运行得到的训练集不一样,时间长了整个训练集都是已知了,那测试集就失去意义了。

import numpy as np
def get_train_set(data, ratio=0.2):
    # 可以先设置seed以保持shuffled不变
    np.random.seed(42)
    shuffled = np.random.permutation(len(data))
    test_set_size = int(len(data) * ratio)
    test_indices = shuffled[:test_set_size]
    train_indices = shuffled[test_set_size:]
    return data.iloc[train_indices], data.iloc[test_indices]

同时scikit learn也提供了方法:random_state就跟前面设seed的功能一样。

from sklearn.model_selection import train_test_split
# random_state是随机种子,如果两次设置相同,则划分结果相同
train_set, test_set = train_test_split(housing, test_size=0.2, random_state=42)

但是,随机挑选的数据可以不够有代表性。假设median income是一个重要的特性,需要对它进行分层抽样。先看一下数据分布:

housing["income_cat"] = pd.cut(housing["median_income"], 
                               bins=[0., 1.5, 3.0, 4.5, 6., np.inf],
                               labels=[1,2,3,4,5])
housing["income_cat"].hist()
plt.show()

在这里插入图片描述
使用scikit learn带的分层抽样函数进行分层:

from sklearn.model_selection import StratifiedShuffleSplit

# n_splits 参数指定了要生成的划分数量. 1就是生成1种随机划分
split = StratifiedShuffleSplit(n_splits=1, test_size=0.2, random_state=42)
for train_index, test_index in split.split(housing, housing["income_cat"]):
    strat_train_set = housing.loc[train_index]
    strat_test_set = housing.loc[test_index]
print(strat_test_set)

此时可以看到,

       longitude  latitude  ...  ocean_proximity  income_cat
5241     -118.39     34.12  ...        <1H OCEAN           5
17352    -120.42     34.89  ...        <1H OCEAN           4
3505     -118.45     34.25  ...        <1H OCEAN           3
7777     -118.10     33.91  ...        <1H OCEAN           3
14155    -117.07     32.77  ...       NEAR OCEAN           3
...          ...       ...  ...              ...         ...
12182    -117.29     33.72  ...        <1H OCEAN           2
7275     -118.24     33.99  ...        <1H OCEAN           2
17223    -119.72     34.44  ...        <1H OCEAN           4
10786    -117.91     33.63  ...        <1H OCEAN           4
3965     -118.56     34.19  ...        <1H OCEAN           3

[4128 rows x 11 columns]

验证一下是否正确分层抽样了:

print(strat_test_set["income_cat"].value_counts() / len(strat_test_set))

3    0.350533
2    0.318798
4    0.176357
5    0.114341
1    0.039971
Name: income_cat, dtype: float64

最终函数为:

def get_train_test_split(data, test_size):
    # 完全随机分类
    # from sklearn.model_selection import train_test_split
    # random_state是随机种子,如果两次设置相同,则划分结果相同
    # test_size是测试集所占的比例 0-1
    # train_set, test_set = train_test_split(data, test_size=test_size, random_state=42)
    # return train_set, test_set

    # 需要对某一列进行分层抽样
    # 先创造一个新列,根据某列内容,给各行打上标签
    data["income_cat"] = pd.cut(housing["median_income"],
                                bins=[0., 1.5, 3.0, 4.5, 6., np.inf],
                                labels=[1, 2, 3, 4, 5])
    from sklearn.model_selection import StratifiedShuffleSplit
    # n_splits 参数指定了要生成的划分数量
    split = StratifiedShuffleSplit(n_splits=1, test_size=test_size, random_state=42)
    for train_index, test_index in split.split(data, data["income_cat"]):
        strat_train_set = data.loc[train_index]
        strat_test_set = data.loc[test_index]
    # 删除刚才创造的新列
    for set_ in (strat_train_set, strat_test_set):
        # axis=1表示删除列
        set_.drop("income_cat", axis=1, inplace=True)
    return strat_train_set, strat_test_set

数据可视化

	train_set, test_set = get_train_test_split(housing, 0.2)
	visual_data = train_set.copy()
    # alpha=0是透明,1是实心
    visual_data.plot(kind="scatter", x="longitude", y="latitude", alpha=0.1)
    plt.show()

在这里插入图片描述
换一种包含信息更多的方式:令散点的直径大小表示人口,颜色表示房价中位值。

	# s是指定散点图中点的大小,figsize默认(6.4, 4.8)格式(width, height)
    # c是散点图中点的颜色
    # cmp是将数据映射到颜色的方式. jet 是一种常用的 colormap,但是它在一些情况下可能会导致误导性
    # 的视觉效果,例如在颜色变化过程中的亮度或暗度变化不均匀。因此,在科学可视化领域,已经不推荐使用
    # jet 了。相反,viridis、plasma、magma 等 colormap 更适合用于科学可视化。
    # 具体来说,viridis 可以在不失真的情况下传达数据的渐变,
    # 而 plasma 和 magma 可以在强调数据的变化时保持不同的亮度和暗度。
    visual_data.plot(kind="scatter", x="longitude", y="latitude", alpha=0.4,
                     s=visual_data["population"]/100, label="population",
                     c="median_house_value", cmap=plt.get_cmap("viridis"),
                     colorbar=True,
                     figsize=(10,7))
    plt.legend()
    plt.show()

在这里插入图片描述
关于几种colormap代表的颜色如下图所示:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/411476.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Springboot实现优雅的参数校验(Spring Validation)和 if else说再见

文章目录一、概述二、注解2.1 空和非空检查2.2 数值检查2.3 Boolean 值检查2.4 长度检查2.5 日期检查2.6 其它检查2.7 Hibernate Validator 附加的约束注解2.8 Valid 和 Validated三、快速入门3.1 引入依赖3.2 创建基本的类3.3 启动程序&#xff0c;进行测试3.3 一些疑问3.3.1 …

抽烟行为识别预警系统 yolov5

抽烟行为识别预警系统基于yolov5网络模型智能分析技术&#xff0c;抽烟行为识别预警算法通过监测现场人员抽烟行为自动存档进行报警提示。我们选择当下YOLO卷积神经网络YOLOv5来进行抽烟识别检测。6月9日&#xff0c;Ultralytics公司开源了YOLOv5&#xff0c;离上一次YOLOv4发布…

该不该放弃嵌入式,单片机这条路?

本文几乎浓缩了我从业10几年的精华&#xff0c;内容涵盖我转行、打工、创业的经历。 建议从头到尾不要错过一字一句&#xff0c;因为字里行间的经验之谈&#xff0c;或许能成为你人生重要转折点。 全文3700多字&#xff0c;写了6个多小时&#xff0c;如果你赶时间&#xff0c;建…

MATLAB——多元函数的极值

目录 计算多元函数的自由极值 计算二元函数在区域D内的最大值和最小值 函数求偏导数的MATLAB命令 例题如下 计算多元函数的自由极值 定义多元函数 Zf(x,x)求解正规方程fx(x,y)0,fy(x,y)0 得到驻点对于每一个驻点&#xff08;x0,y0&#xff09;&#xff0c;求二阶偏导 A B …

系统复杂度之【高性能】

系统复杂度之【高性能】 今天我们来谈一谈系统复杂度的根源之【高性能】 对性能的不懈追求一直是人类科技持续发展的核心动力。例如计算机&#xff0c;从电子管计算机到晶体管计算机&#xff0c;再到集成电路计算机&#xff0c;运算性能从每秒几次提高到每秒几亿次。然而&#…

Java开发 - 读写分离初体验

前言 上一篇中&#xff0c;我们介绍了主从复制&#xff0c;相信学过的小伙伴已经能够很好的掌握主从复制的技术&#xff0c;实际上也并没有那么难&#xff0c;虽然没有讲一主多从&#xff0c;多主多从的配置&#xff0c;但是从一主一从的配置中也很容易联想到该怎么配置&#…

2023年顶级编程语言趋势

对于开发人员和软件工程师来说&#xff0c;选择更优秀的编程语言使编写可以在任何地方运行的软件变得更加容易&#xff0c;工作效率更高。从 Java 的缓慢衰落到 MATLAB 的惊人流行&#xff0c;对当今最流行的编程语言的分析&#xff0c;可以帮助你了解最新趋势并响应最新趋势。…

4.5、协议

4.5、协议1.简介2.常见协议3.UDP协议4.TCP协议5.IP协议6.以太网帧协议7.ARP协议1.简介 协议&#xff0c;网络协议的简称&#xff0c;网络协议是通信计算机双方必须共同遵从的一组约定。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定&#xff0c;计算机之间才能相互通信…

JAVA NIO简解

1. 了解NIO 1.1.什么是NIO&#xff1f; Java nio是Java的一个新的输入输出&#xff08;NewInput/Output&#xff09;API&#xff0c;它提供了一些高效的数据处理方式&#xff0c;如缓冲区&#xff08;buffers&#xff09;、字符集&#xff08;charsets&#xff09;、通道&#…

No.036<软考>《(高项)备考大全》【第20章】项目集管理

【第20章】项目集管理1 考试相关2项目集合项目组合的区别2.1 项目组合、项目集、项目管理之间的关系&#xff1a;2.3 举例说三者的关系3 项目集管理3.1 项目集管理与项目管理区别3.2 项目集指导委员会3.3 项目集生命周期4 练习题参考答案1 考试相关 选择1分必考 案例概率低&am…

Ubuntu 23.04 新特性一览

Ubuntu 23.04 “Lunar Lobster” 计划于 2023 年 4 月 20 日星期四发布&#xff0c;这是 Ubuntu 桌面的第 38 个版本。作为一个短期版本&#xff0c;Ubuntu 23.04 共获得了 9 个月的持续更新、安全补丁和关键修复。 在正式发布之前&#xff0c;OMG! Ubuntu! 汇总整理了一些 Ub…

京东产发奔赴港股上市,分拆上市或成互联网大厂的共同选择?

‍数据智能产业创新服务媒体——聚焦数智 改变商业3月30日晚间&#xff0c;京东集团&#xff08;9618.HK&#xff09;相继发布2则公告称&#xff0c;拟分拆京东智能产发股份有限公司&#xff08;以下简称“京东产发”&#xff09;、京东工业股份有限公司&#xff08;以下简称“…

基于改进多目标灰狼优化算法的考虑V2G技术的风、光、荷、储微网多目标日前优化调度研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

( “树” 之 DFS) 404. 左叶子之和 ——【Leetcode每日一题】

404. 左叶子之和 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子&#xff0c;分别是 9 和 15&#xff0c;所以返回 24 示例 2: 输入: root [1]…

当ChatGPT续写《红楼梦》,能替代原著吗?

来源: 清华大学出版社 近段时间&#xff0c;人工智能聊天机器人ChatGPT火爆网络&#xff0c;“AI写作是否会让文字工作者被替代&#xff1f;”成为人们关注并持续讨论的话题。 闲聊、问答、解题、写代码、写诗、创作小说&#xff0c; 连续回答&#xff0c;不断纠错&#xff0c…

window下面安装phpstudy进行PHP开发

文章目录前言在这里插入图片描述一、安装步骤1.1 下载PHPStudy软件1.2 安装PHPStudy软件1.3 启动PHPStudy软件1.4 设置PHPStudy1.5 安装扩展1.6 启动服务总结前言 php的集成开发环境比较多&#xff0c;有wamp server&#xff0c;xmapp&#xff0c;phpstudy等。经过这些年的体验…

【李宏毅】深度学习——HW5-Machine Translation

Machine Translation 1. Goal 给定一段英文&#xff0c;翻译成繁体中文 2. Introduction 2.1 Dataset training dataset TED2020: TED talks with transcriptions translated by a global community of volunteers to more than 100 language.we will use (en, zh-tw) alig…

身临其境数字世界:探索VR全景元宇宙展厅

随着科技的不断发展&#xff0c;虚拟现实技术已经成为我们生活中的一部分。VR全景元宇宙展厅作为其中的一种形式&#xff0c;正越来越受欢迎。在这里&#xff0c;您可以探索未知的世界&#xff0c;体验全新的视觉和感官体验。 一、VR全景元宇宙展厅的概述 VR全景元宇宙展厅是一…

Kafka---kafka概述和kafka基础架构

kafka概述和kafka基础架构 文章目录kafka概述和kafka基础架构Kafka定义消息队列传统消息队列应用场景缓存/消峰解耦异步通信消息队列的两种模式点对点模式发布/订阅模式kafka基础架构producerConsumerConsumer Group&#xff08;CG&#xff09;BrokerTopicPartitionReplicaLead…

基于html+css的盒子内容旋转180度

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…