机器学习流程及详细内容(1)

article/2025/8/8 10:01:34

一般流程:数据收集、整理→数据预处理与特征工程(数据清理、集成、规约、变换、特征提取、筛选)→模型的选择与建立→模型的评估与优化。

数据收集

既可以使用公开的数据集,也可通过爬虫、购买或者实时数据的方式自己收集。

UCI官网:UCI Machine Learning Repository。里面有许多公开可下载的数据集。

爬虫:比如在http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data爬取数据。

import os
import pandas as pddef ReadAndSaveDataByPandas(target_url=None, save=False):wine = pd.read_csv(target_url, header=0, sep=",")if save == True:print(os.getcwd())  # 获取当前工作路径wine.to_csv('Result.csv', index=0, header=1)  # 相对位置,保存在getwcd()获得的路径下target_url = "http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
ReadAndSaveDataByPandas(target_url, True)

数据预处理

运用sklearn_preprocessing,在拿到一批原始的数据时:

首先要明确有多少特征,哪些是连续的,哪些是类别的。
检查有没有缺失值,对确实的特征选择恰当方式进行弥补,使数据完整。
对连续的数值型特征进行标准化,使得均值为0,方差为1。
对类别型的特征进行one-hot编码。
将需要转换成类别型数据的连续型数据进行二值化。
为防止过拟合或者其他原因,选择是否要将数据进行正则化。
在对数据进行初探之后发现效果不佳,可以尝试使用多项式方法,寻找非线性的关系。
根据实际问题分析是否需要对特征进行相应的函数转换。

1. 标准化:去均值,方差规模化

Standardization标准化:将特征数据的分布调整成标准正态分布,也叫高斯分布,也就是使得数据的均值为0,方差为1。

标准化的原因在于如果有些特征的方差过大,则会主导目标函数从而使参数估计器无法正确地去学习其他特征。

标准化的过程为两步:去均值的中心化(均值变为0);方差的规模化(方差变为1)。

在sklearn.preprocessing中提供了一个scale的方法,可以实现以上功能。

from sklearn import preprocessing
import numpy as np# 创建一组特征数据,每一行表示一个样本,每一列表示一个特征
x = np.array([[1., -1., 2.],[2., 0., 0.],[0., 1., -1.]])# 将每一列特征标准化为标准正太分布,注意,标准化是针对每一列而言的
x_scale = preprocessing.scale(x)x_scale

# 可以查看标准化后的数据的均值与方差,已经变成0,1了
x_scale.mean(axis=0)# array([0., 0., 0.])# axis=1表示对每一行去做这个操作,axis=0表示对每一列做相同的这个操作
x_scale.mean(axis=1)#array([ 0.03718711,  0.31916121, -0.35634832])# 同理,看一下标准差
x_scale.std(axis=0)#array([ 1.,  1.,  1.])

preprocessing这个模块还提供了一个实用类StandarScaler,它可以在训练数据集上做了标准转换操作之后,把相同的转换应用到测试训练集中。这是相当好的一个功能。可以对训练数据,测试数据应用相同的转换,以后有新的数据进来也可以直接调用,不用再重新把数据放在一起再计算一次了。

# 调用fit方法,根据已有的训练数据创建一个标准化的转换器
scaler = preprocessing.StandardScaler().fit(x)
scaler# StandardScaler()# 使用上面这个转换器去转换训练数据x,调用transform方法
scaler.transform(x)# array([[ 0.        , -1.22474487,  1.33630621],
#       [ 1.22474487,  0.        , -0.26726124],
#       [-1.22474487,  1.22474487, -1.06904497]])# 好了,比如现在又来了一组新的样本,也想得到相同的转换
new_x = [[-1., 1., 0.]]
scaler.transform(new_x)#array([[-2.44948974,  1.22474487, -0.26726124]])

另外,StandardScaler()中可以传入两个参数:with_mean,with_std.这两个都是布尔型的参数,默认情况下都是true,但也可以自定义成false.即不要均值中心化或者不要方差规模化为1。

1.1 规模化特征到一定的范围内

也就是使得特征的分布是在一个给定最小值和最大值的范围内的。一般情况下是在[0,1]之间,或者是特征中绝对值最大的那个数为1,其他数以此维标准分布在[[-1,1]之间

以上两者分别可以通过MinMaxScaler 或者 MaxAbsScaler方法来实现。

之所以需要将特征规模化到一定的[0,1]范围内,是为了对付那些标准差相当小的特征并且保留下稀疏数据中的0值。

MinMaxScaler
在MinMaxScaler中是给定了一个明确的最大值与最小值。它的计算公式如下:

X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))

X_scaled = X_std / (max - min) + min

以下这个例子是将数据规与[0,1]之间,每个特征中的最小值变成了0,最大值变成了1。

min_max_scaler = preprocessing.MinMaxScaler()
x_minmax = min_max_scaler.fit_transform(x)
x_minmax# array([[ 0.5       ,  0.        ,  1.        ],
#       [ 1.        ,  0.5       ,  0.33333333],
#       [ 0.        ,  1.        ,  0.        ]])
# 同样的,如果有新的测试数据进来,也想做同样的转换x_test = np.array([[-3., -1., 4.]])
x_test_minmax = min_max_scaler.transform(x_test)
x_test_minmax#array([[-1.5       ,  0.        ,  1.66666667]])

MaxAbsScaler

原理与上面的很像,只是数据会被规模化到[-1,1]之间。也就是特征中,所有数据都会除以最大值。这个方法对那些已经中心化均值维0或者稀疏的数据有意义。

例:

max_abs_scaler = preprocessing.MaxAbsScaler()
x_train_maxsbs = max_abs_scaler.fit_transform(x)
x_train_maxsbs# array([[ 0.5, -1. ,  1. ],
#       [ 1. ,  0. ,  0. ],
#       [ 0. ,  1. , -0.5]])
# 同理,也可以对新的数据集进行同样的转换x_test = np.array([[-3., -1., 4.]])
x_test_maxabs = max_abs_scaler.transform(x_test)
x_test_maxabs# array([[-1.5, -1. ,  2. ]])

1.2 规模化稀疏数据

如果对稀疏数据进行去均值的中心化就会破坏稀疏的数据结构。虽然如此,也可以找到方法去对稀疏的输入数据进行转换,特别是那些特征之间的数据规模不一样的数据。

MaxAbsScaler 和 maxabs_scale这两个方法是专门为稀疏数据的规模化所设计的。

1.3 规模化有异常值的数据

如果数据有许多异常值,那么使用数据的均值与方差去做标准化就不行了。

在这里,可以使用robust_scale 和 RobustScaler这两个方法。它会根据中位数或者四分位数去中心化数据。

2. 正则化Normalization

正则化是将样本在向量空间模型上的一个转换,经常被使用在分类与聚类中。

函数normalize 提供了一个快速有简单的方式在一个单向量上来实现这正则化的功能。正则化有l1,l2等,这些都可以用上:

x_normalized = preprocessing.normalize(x, norm='l2')
print x
print x_normalized# [[ 1. -1.  2.]
#  [ 2.  0.  0.]
#  [ 0.  1. -1.]]
# [[ 0.40824829 -0.40824829  0.81649658]
#  [ 1.          0.          0.        ]
#  [ 0.          0.70710678 -0.70710678]]
# preprocessing这个模块还提供了一个实用类Normalizer,实用transform方法同样也可以对新的数据进行同样的转换# 根据训练数据创建一个正则器
normalizer = preprocessing.Normalizer().fit(x)
normalizer# Normalizer(copy=True, norm='l2')
# 对训练数据进行正则
normalizer.transform(x)# array([[ 0.40824829, -0.40824829,  0.81649658],
#       [ 1.        ,  0.        ,  0.        ],
#       [ 0.        ,  0.70710678, -0.70710678]])
# 对新的测试数据进行正则
normalizer.transform([[-1., 1., 0.]])# array([[-0.70710678,  0.70710678,  0.        ]])

normalize和Normalizer都既可以用在密集数组也可以用在稀疏矩阵(scipy.sparse)中

对于稀疏的输入数据,它会被转变成压缩的稀疏矩阵(scipy.sparse.csr_matrix)

3.二值化–特征的二值化

特征的二值化是指将数值型的特征数据转换成布尔类型的值。可以使用实用类Binarizer。

x = np.array([[1., -1., 2.],[2., 0., 0.],[0., 1., -1.]])
binarizer = preprocessing.Binarizer().fit(x)
binarizer.transform(x)# array([[ 1.,  0.,  1.],
#       [ 1.,  0.,  0.],
#       [ 0.,  1.,  0.]])

默认是根据0来二值化,大于0的都标记为1,小于等于0的都标记为0。

当然也可以自己设置这个阀值,只需传出参数threshold即可。

binarizer = preprocessing.Binarizer(threshold=1.5)
binarizer.transform(x)# array([[ 0.,  0.,  1.],
#       [ 1.,  0.,  0.],
#       [ 0.,  0.,  0.]])

binarize and Binarizer都可以用在密集向量和稀疏矩阵上。

4.为类别特征编码

特征可能是连续型的也可能是类别型的变量,比如说:

[“male”, “female”], [“from Europe”, “from US”, “from Asia”], [“uses Firefox”, “uses Chrome”, “uses Safari”, “uses Internet Explorer”].

这些类别特征无法直接进入模型,它们需要被转换成整数来表征,比如:

[“male”, “from US”, “uses Internet Explorer”] could be expressed as [0, 1, 3] while [“female”, “from Asia”, “uses Chrome”] would be [1, 2, 1].

然而上面这种表征的方式仍然不能直接为scikit-learn的模型所用,因为模型会把它们当成序列型的连续变量。

要想使得类别型的变量能最终被模型直接使用,可以使用one-of-k编码或者one-hot编码。这些都可以通过OneHotEncoder实现,它可以将有n种值的一个特征变成n个二元的特征。

enc = preprocessing.OneHotEncoder()
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])
enc.transform([[0,1,3]]).toarray()# array([[ 1.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  1.]])

但是也会存在这样的情况,某些特征中可能对一些值有缺失,比如有男女两个性别,样本数据中都是男性,这样就会默认被判别为只有一类值,此时可以向OneHotEncoder传入参数categories,用来指明每个特征中的值的总个数。

genders = ['female', 'male']
locations = ['from Africa', 'from Asia', 'from Europe', 'from US']
browsers = ['uses Chrome', 'uses Firefox', 'uses IE', 'uses Safari']
enc = preprocessing.OneHotEncoder(categories=[genders, locations, browsers])
X = [['male', 'from US', 'uses Safari'], ['female', 'from Europe', 'uses Firefox']]
enc.fit(X)

enc.transform([['female', 'from Asia', 'uses Chrome']]).toarray()

5.弥补缺失数据

在scikit-learn的模型中都是假设输入的数据是数值型的,并且都是有意义的,如果有缺失数据是通过NAN,或者空值表示的话,就无法识别与计算了。

要弥补缺失值,可以使用均值,中位数,众数等等。Imputer这个类可以实现。

from sklearn.impute import SimpleImputer
imp = SimpleImputer(missing_values=np.nan, strategy='mean')
imp.fit([[1, 2], [np.nan, 3], [7, 6]])x = [[np.nan, 2], [6, np.nan], [7, 6]]
imp.transform(x)

 Imputer类同样也可以支持稀疏矩阵,以下例子将0作为了缺失值,为其补上均值

>>> import scipy.sparse as sp
>>> X = sp.csc_matrix([[1, 2], [0, 3], [7, 6]])
>>> imp = Imputer(missing_values=0, strategy='mean', axis=0)
>>> imp.fit(X)
Imputer(axis=0, copy=True, missing_values=0, strategy='mean', verbose=0)
>>> X_test = sp.csc_matrix([[0, 2], [6, 0], [7, 6]])
>>> print(imp.transform(X_test))                      
[[ 4.          2.        ][ 6.          3.666...][ 7.          6.        ]]

6.创建多项式特征

有时候线性的特征并不能做出好的模型,就会让人去尝试非线性。非线性是建立在将特征进行多项式地展开上的。比如将两个特征 (X_1, X_2),它的平方展开式便转换成5个特征(1, X_1, X_2, X_1^2, X_1X_2, X_2^2). 如:

from sklearn.preprocessing import PolynomialFeatures
# 自建一组3*2的样本
x = np.arange(6).reshape(3, 2)# 创建2次方的多项式
poly = PolynomialFeatures(2)poly.fit_transform(x)

 可以看到形成了3*6的特征矩阵,里面有5个特征,加上第一列的是Bias.

也可以自定义选择只要保留特征相乘的项。
即将 (X_1, X_2, X_3) 转换成 (1, X_1, X_2, X_3, X_1X_2, X_1X_3, X_2X_3, X_1X_2X_3).

 

7.自定义特征的转换函数

通俗的讲,就是把原始的特征放进一个函数中做转换,这个函数出来的值作为新的特征。

比如说将特征数据做log转换,做倒数转换等等。

FunctionTransformer 可以实现这个功能

from sklearn.preprocessing import FunctionTransformer
transformer = FunctionTransformer(np.log1p)
x = np.array([[0, 1], [2, 3]])
transformer.transform(x)

 通过以上的预处理方法即可处理出自己想要的数据


http://chatgpt.dhexx.cn/article/xpaYvPar.shtml

相关文章

机器学习(Machine Learning)与深度学习(Deep Learning)资料汇总

《Brief History of Machine Learning》 介绍:这是一篇介绍机器学习历史的文章,介绍很全面,从感知机、神经网络、决策树、SVM、Adaboost到随机森林、Deep Learning. 《Deep Learning in Neural Networks: An Overview》 介绍:这是瑞士人工智能实验室Jurg…

Flutter 学习

Flutter 学习 参照:https://book.flutterchina.club/ 参照:https://flutter.cn/docs/development/platform-integration/platform-channels?tabtype-mappings-java-tab 目前进度:https://book.flutterchina.club/chapter9/animated_widgets…

原生开发如何学习 Flutter | 谷歌社区说

Hello 大家好,我是《Flutter 开发实战详解》的作者,Github GSY 系列开源项目的负责人郭树煜,目前开源的 gsy_github_app_flutter 以 13k 的 star 在中文总榜的 dart 排行上暂处第一名。 数据来源: https://github.com/GrowingGit/…

【CVRP】基于matlab遗传算法求解带容量的车辆路径规划问题【含Matlab源码 162期】

⛄一、VRP简介 车辆路径问题(VRP)最早是由 Dantzig 和 Ramser 于1959年首次提出,它是指一定数量的客户,各自有不同数量的货物需求,配送中心向客户提供货物,由一个车队负责分送货物,组织适当的行…

matlab解决LRP类型的多配送中心路径优化问题

** 问题描述 ** 有关多配送中心的选址-路径优化问题,一般是通过基于区域内的客户需要求,对配送中心进行合理的选址以及配送中心的车辆调度以及路径优化。在给出的配送中心候选点位置已知,需要在给出的这些位置中,通过与顾客需求…

<代码分享> 一种无人机配合卡车配送的车辆路径规划模型

本文为本人博客《一种无人机配合卡车配送的车辆路径规划模型》的代码分享。 由于近期此文的关注者较多,代码分享较为不便,因此决定专门写一篇博客以提供源码。 感谢各位博友关注,本人能力有限,如有错误,还请及时批评指…

(附源码)springboot车辆管理系统 毕业设计031034

车辆管理系统的设计与实现 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时代。在现实运用中&…

QT+SQL Server实现车辆管理系统 -代码具体实现

QTSQL Server 实现车辆管理系统 -代码具体实现 1.摘要2.整体框架3.具体代码实现3.1 连接数据库3.2 登录操作3.3 申请账户3.4 添加车辆信息3.5 查询车辆信息3.6删除车辆信息3.7修改车辆信息3.8 添加司机信息 4.总结5.资源下载链接 1.摘要 前面一篇文章简要介绍了车辆管理系统的…

如何使用低代码进行车队管理?

处理任何业务都具有挑战性,但车队管理无疑是所有业务中的佼佼者。无论是司机短缺、环境问题、国际法规还是行业不稳定,车队经理都必须面对这一切。除此之外,还有数字化和路线优化的概念。数字化转型车队管理业务意味着消除挑战,拥…

车辆自然驾驶轨迹数据集/交通流数据介绍

文章目录 NGSIMNGSIM 概览快速路车道选择算法Interstate 80 Freeway 数据集Lankershim Boulevard 数据集US highway101数据集动态交通分配DTACORSIM Argoverse Motion Forecasting DatasetAIMSUNHighDITS DataHub 美国智能交通数据库Data.govPeMSPortland Oregon Region data英…

3D车辆检测AP评价指标代码的理解

课题研究的是单目3D车辆的识别,采用的目标检测网络是SMOKE,为了可以更好的定量评测训练模型的性能,需要使用到合理的评测指标,目前比较流行的评测指标是得到多组precision和recall值画出PR曲线,然后计算PR曲线下的面积…

根据车辆型号自动生成车辆编号

开发工具与关键技术:Visual Studio 2015 linq 正则 作者:孙水兵 撰写时间:2019年6月26一、 功能 根据不同的类型的车辆型号,生成以车辆型号开头的车辆编号。 二、 达到的效果 用户选择了车辆型号之后,将对应的车辆编…

【路径规划】基于遗传算法求解多车多类型车辆的车辆路径优化问题附matlab代码

1 内容介绍 多车辆多路线的交通路线优化涉及到排序问题,是一个N-P难题,高效精确的算法存在的可能性不大.提出了基于遗传算法的求解方法,给出了实例来证明如何利用遗传算法解决多车辆多路线的优化问题.结果证明,一般情况下利用遗传算法对于多车辆多路线的行车路线优化能得到一组…

机动车登记信息代码

原链接:机动车登记信息代 搜索结果本栏目用于收集和整理行业相关标准,如机械行业,化工行业等。http://www.gb99.cn/e/search/result/?searchid76243针对其中第七项车辆信息牌照代码如下:

利用低代码平台进行车辆管理,为交通行业添砖加瓦

概要:本文介绍了交通行业车辆管理的重要性,并详细阐述了基于低代码平台设计的车辆管理系统的优势。通过快速开发、易于维护、增加灵活性、提高数据可靠性、降低成本以及实时监控等多个方面,这种车辆管理系统可以帮助企业提高效率和降低成本&a…

(c++课程设计)简单车辆管理系统(有五种类型的车辆)代码+报告

关于这个课程设计 ,差点没把我头发愁没。 好了其实本质还是东拼西凑,编程能力没怎么长进,花里胡哨的东西却学了不少(不是) 万恶的学院,虽然要求三人一组,但是却分一二三类,三个人代…

什么是车辆识别代码(VIN)

车辆识别代码(VIN),VIN是英文Vehicle Identification Number(车辆识别码)的缩写。因为ASE标准规定:VIN码由17位字符组成,所以俗称十七位码。正确解读VIN码,对于我们正确地识别车型,以致进行正确地诊断和维修都是十分重要的。车辆识别代码根据国家车辆管理标准确定,包…

Eigen学习笔记1:在VS2015下Eigen(矩阵变换)的配置

一、Eigen简介 Eigen是一个高层次的C 库,有效支持线性代数,矩阵和矢量运算,数值分析及其相关的算法。 Eigen适用范围广,支持包括固定大小、任意大小的所有矩阵操作,甚至是稀疏矩阵;支持所有标准的数值类型&…

鲁鹏老师三维重建课程之单视图重建

配置Json环境 使用Jsoncpp包中的.cpp和 .h文件 解压上面下载的 Jsoncpp 文件,把 jsoncpp-src-0.5.0文件拷贝到工程目录下, 将 jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\include\json 和 jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\src\lib_json 目录里的文…

常用 Linux 软件汇总!很全,但不敢说最全

点击下方公众号「关注」和「星标」 回复“1024”获取独家整理的学习资料! 音频 Airtime - Airtime 是一款用于调度和远程站点管理的开放广播软件 Ardour - 在 Linux 上录音,编辑,和混音 Audacious - 开源音频播放器,按你想要的方式…