Python机器学习从入门到高级:带你玩转特征转换(含详细代码)

简介: Python机器学习从入门到高级:带你玩转特征转换(含详细代码)

Python机器学习从入门到高级:带你玩转特征转换(含详细代码)

  • 🌸个人主页:JoJo的数据分析历险记
  • 📝个人介绍:小编大四统计在读,目前保研到统计学top3高校继续攻读统计研究生
  • 💌如果文章对你有帮助,欢迎关注点赞收藏订阅 专栏

上一章我们介绍了如何进行基本的数据清洗工作。加下来我们来看看如何进行==特征转换==,学统计学的小伙伴一定知道什么是标准化,这其实就是一种==特征转换==,在一些模型中,==特征转换==是有必要的。(例如某些神经网络问题,使用==特征转换==可以收敛更快)

🌲1.min-max缩放

min-max缩放的基本思想是将所有的数据都转换到了某一固定区间,默认的是转换到0-1,其中最小的数据为0,最大的数据为1,变换公式如下:

$$ z=\frac{X-X_{min}}{X_{max}-X_{min}} $$

下面来看看如何使用代码实现:

首先导入相关库

import numpy as np
from sklearn import preprocessing #处理数据预处理包
# 首先我们建立一个特征
feature = np.array([[-500.5],
                  [-100.1],
                  [0],
                  [100.1],
                  [900.9]])
feature
array([[-500.5],
       [-100.1],
       [   0. ],
       [ 100.1],
       [ 900.9]])


下面我们使用MinMaxScaler()进行特征缩放,具体代码和结果如下

# 1.创建min_max缩放器
minmax_feature = preprocessing.MinMaxScaler()
# 2.对我们要装换的数据进行缩放
scaled_feature = minmax_feature.fit_transform(feature)
scaled_feature
array([[0.        ],
       [0.28571429],
       [0.35714286],
       [0.42857143],
       [1.        ]])


其中==0.2857== = $\frac{-100.1+500.5}{900.9+500.5}$

拓展:MinMaxScaler()默认会返回到==0-1==之间,但是有的时候我们希望转换到-1到1之间,或者==0-2==之间,我们可以进行相关定义,具体代码如下:

minmat_0_2 = preprocessing.MinMaxScaler((0,2))
scaled_feature = minmat_0_2.fit_transform(feature)
scaled_feature
array([[0.        ],
       [0.57142857],
       [0.71428571],
       [0.85714286],
       [2.        ]])


其中==0.5714== = $2\times \frac{-100.1+500.5}{900.9+500.5}$

🌳2.标准化缩放

标准化缩放是我们应用最广泛的方法之一,尤其在统计学当中,我们在建立一些统计模型时,往往先把数据标准化处理。尤其在统计推断中,根据中心极限定理,当数据足够多,我们往往对数据进行标准化之后认为其满足标准正态分布或近似满足标准正态分布,具体公式如下:

$$ z = \frac{x-\mu}{\sigma} $$

  • 使用scikit-learnStandardScaler
# 创建特征
feature = np.array([[-1000.1],
                    [-200.2],
                    [500.5],
                    [600.6],
                    [9000.9]])
# 创建缩放器
scaler = preprocessing.StandardScaler()
# 标准化
standard = scaler.fit_transform(feature)
standard
array([[-0.76058269],
       [-0.54177196],
       [-0.35009716],
       [-0.32271504],
       [ 1.97516685]])


标准化使用的比minmax更为常见,转换后认为其服从标准正态分布,下面我们来看一下标准化后数据的均值和标准差

print('mean:', round(standard.mean()))
print('std:', standard.std())
mean: 0
std: 1.0

==拓展==:如果数据存在很严重的异常值,可能会影响特征的平均值和方差,也会对标准化早造成不好的影响,我们一般使用中位数和四分位数间距来进行缩放,默认转换规则如下:

$$ z = \frac{x-x_{median}}{x_{0.75}-x_{0.25}} $$

具体代码和结果如下

# 创建缩放器,默认是以中位数进行缩放
robust_scaler = preprocessing.RobustScaler()
robust_scaler.fit_transform(feature)
array([[-1.87387612],
       [-0.875     ],
       [ 0.        ],
       [ 0.125     ],
       [10.61488511]])


其中 ==-0.875== $= \frac{-200.2-500.5}{600.6+200.2}$

🌴3.归一化

归一化处理是一种去量纲比较常用的方法,例如在层次分析法中,我们会使用归一化处理
主要分为L1L2归一化,在Normalizer()中,默认是L2归一化,假设有一个m×n的矩阵,两种方法的公式如下:

$$ L1: Z_{ij}=\frac{X_{ij}}{\sum_{j=1}^{n}X_{ij}} $$

L1归一化基本思想是使得每一行相加等于1

$$ L2:Z_{ij}=\frac{X_{ij}}{\sqrt{\sum_{j=1}^{n}X_{ij}^2}} $$

L2归一化基本思想是使得每一行平方相加等于1

具体代码实现如下

Normalizer()默认是==L2==归一化

feature = np.array([[0.5, 0.5],
                    [1.1, 3.4],
                    [1.5, 20.2],
                    [1.63, 34.4],
                    [10.9, 3.3]])
normalizer = preprocessing.Normalizer()
normalized = normalizer.fit_transform(feature)
normalized
array([[0.70710678, 0.70710678],
       [0.30782029, 0.95144452],
       [0.07405353, 0.99725427],
       [0.04733062, 0.99887928],
       [0.95709822, 0.28976368]])






# 如果以l1范数来归一化,则如下代码,他使每一行的和相加为1
normalized2 = preprocessing.Normalizer(norm='l1').transform(feature)
normalized2
array([[0.5       , 0.5       ],
       [0.24444444, 0.75555556],
       [0.06912442, 0.93087558],
       [0.04524008, 0.95475992],
       [0.76760563, 0.23239437]])


🌵4.生成多项式和交互特征

  • 使用degree参数选择多项式的最高阶数
  • 使用interaction_only可以选择只有交互项
features = np.array([[2,3]])
polynomial = preprocessing.PolynomialFeatures(degree=2)
polynomial.fit_transform(features)
array([[1., 2., 3., 4., 6., 9.]])



# 此时把0次向也放在里面 
polynomial = preprocessing.PolynomialFeatures(degree=2, include_bias=False)#此时不包括0此项
polynomial.fit_transform(features)
array([[2., 3., 4., 6., 9.]])



# 设置只包含交互项
interaction = preprocessing.PolynomialFeatures(degree=2,
                                              interaction_only=True, include_bias=False)
interaction.fit_transform(features)
array([[2., 3., 6.]])


🌾5.使用函数进行特征转换

# 使用FunctionTransform 对一组特征应用一个函数
def add_ten(x):
    return x+10
ten_transformer = preprocessing.FunctionTransformer(add_ten,validate=False)
ten_transformer.transform(features)
array([[12, 13]])


上述和pandas使用apply函数是一样的效果

🌿6.处理异常值

import pandas as pd 
houses = pd.DataFrame()
houses['Price'] = [534433, 392333, 293222, 4322032]
houses['Bathrooms'] = [2, 3.5, 2, 116]
houses['Squre_Feet'] = [1500, 2500, 1500, 48000]
  • ==思路一==
# 1.删选观察值
houses[houses['Bathrooms']<20]
Price Bathrooms Squre_Feet
0 534433 2.0 1500
1 392333 3.5 2500
2 293222 2.0 1500
  • ==思路二==:将异常值标记,并作为数据的一个特征
# 第二种思路,将异常值标记,并作为数据的一个特征
houses['Outlier'] = np.where(houses['Bathrooms']<20, 0, 1)#小于20的即为1
houses
Price Bathrooms Squre_Feet Outlier
0 534433 2.0 1500 0
1 392333 3.5 2500 0
2 293222 2.0 1500 0
3 4322032 116.0 48000 1
  • ==思路三==,对所有值进行转换,来降低异常值的影响
# 第三种思路
houses['Log_of_Squre_Feet'] = [np.log(x) for x in houses['Squre_Feet']]
houses
Price Bathrooms Squre_Feet Outlier Log_of_Squre_Feet
0 534433 2.0 1500 0 7.313220
1 392333 3.5 2500 0 7.824046
2 293222 2.0 1500 0 7.313220
3 4322032 116.0 48000 1 10.778956

因为异常值会对均值和标准差都造成较大的影响,所以一般使用对异常值鲁棒性更高的放缩方法,例如之前介绍的RobustScaler

☘️7.将特征离散化

基本思路是根据给一个阈值将特征离散化。

  • ==方法1==:使用Binarizer
from sklearn.preprocessing import Binarizer
age = np.array([[6],[12],[20],[36],[65]])
binary = Binarizer(18)
binary.fit_transform(age)
array([[0],
       [0],
       [1],
       [1],
       [1]])
  • ==方法2==:使用numpy 将设定多个阈值来使特征离散化
np.digitize(age, bins=[20, 30, 64])
array([[0],
       [0],
       [1],
       [2],
       [3]], dtype=int64)

阈值的设定是左闭右开 所以第一个区间不包括20。

本章的介绍到此介绍,如果文章对你有帮助,请多多点赞、收藏、评论、关注支持!!

相关文章
|
16天前
|
开发框架 数据建模 中间件
Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器是那些静悄悄的幕后英雄。它们不张扬,却能默默地为函数或类增添强大的功能。本文将带你了解装饰器的魅力所在,从基础概念到实际应用,我们一步步揭开装饰器的神秘面纱。准备好了吗?让我们开始这段简洁而富有启发性的旅程吧!
25 6
|
14天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
6天前
|
机器学习/深度学习 传感器 运维
使用机器学习技术进行时间序列缺失数据填充:基础方法与入门案例
本文探讨了时间序列分析中数据缺失的问题,并通过实际案例展示了如何利用机器学习技术进行缺失值补充。文章构建了一个模拟的能源生产数据集,采用线性回归和决策树回归两种方法进行缺失值补充,并从统计特征、自相关性、趋势和季节性等多个维度进行了详细评估。结果显示,决策树方法在处理复杂非线性模式和保持数据局部特征方面表现更佳,而线性回归方法则适用于简单的线性趋势数据。文章最后总结了两种方法的优劣,并给出了实际应用建议。
31 7
使用机器学习技术进行时间序列缺失数据填充:基础方法与入门案例
|
9天前
|
数据可视化 Python
以下是一些常用的图表类型及其Python代码示例,使用Matplotlib和Seaborn库。
通过这些思维导图和分析说明表,您可以更直观地理解和选择适合的数据可视化图表类型,帮助更有效地展示和分析数据。
48 8
|
16天前
|
API Python
【Azure Developer】分享一段Python代码调用Graph API创建用户的示例
分享一段Python代码调用Graph API创建用户的示例
41 11
|
15天前
|
IDE 程序员 开发工具
Python编程入门:打造你的第一个程序
迈出编程的第一步,就像在未知的海洋中航行。本文是你启航的指南针,带你了解Python这门语言的魅力所在,并手把手教你构建第一个属于自己的程序。从安装环境到编写代码,我们将一步步走过这段旅程。准备好了吗?让我们开始吧!
|
15天前
|
测试技术 开发者 Python
探索Python中的装饰器:从入门到实践
装饰器,在Python中是一块强大的语法糖,它允许我们在不修改原函数代码的情况下增加额外的功能。本文将通过简单易懂的语言和实例,带你一步步了解装饰器的基本概念、使用方法以及如何自定义装饰器。我们还将探讨装饰器在实战中的应用,让你能够在实际编程中灵活运用这一技术。
35 7
|
14天前
|
Python
探索Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器就像是给函数穿上了一件神奇的外套,让它们拥有了超能力。本文将通过浅显易懂的语言和生动的比喻,带你了解装饰器的基本概念、使用方法以及它们如何让你的代码变得更加简洁高效。让我们一起揭开装饰器的神秘面纱,看看它是如何在不改变函数核心逻辑的情况下,为函数增添新功能的吧!
|
15天前
|
程序员 测试技术 数据安全/隐私保护
深入理解Python装饰器:提升代码重用与可读性
本文旨在为中高级Python开发者提供一份关于装饰器的深度解析。通过探讨装饰器的基本原理、类型以及在实际项目中的应用案例,帮助读者更好地理解并运用这一强大的语言特性。不同于常规摘要,本文将以一个实际的软件开发场景引入,逐步揭示装饰器如何优化代码结构,提高开发效率和代码质量。
41 6
|
16天前
|
开发者 Python
Python中的装饰器:从入门到实践
本文将深入探讨Python的装饰器,这一强大工具允许开发者在不修改现有函数代码的情况下增加额外的功能。我们将通过实例学习如何创建和应用装饰器,并探索它们背后的原理和高级用法。
34 5