精华内容
下载资源
问答
  • 信息编码的方法
    千次阅读
    2021-03-03 20:57:18

    mysql的默认编码是latin1,不支持中文,要支持中文需要把数据库的默认编码修改为gbk或者utf8。

    1、需要以root用户身份登陆才可以查看数据库编码方式

    (以root用户身份登陆的命令为:

    复制代码 代码示例:

    [root@localhost bin]# mysql -u root -p

    enter password:

    welcome to the mysql monitor.  commands end with ; or \g.

    your mysql connection id is 6

    server version: 5.0.77 source distribution

    type 'help;' or '\h' for help. type '\c' to clear the buffer.

    查看数据库的编码方式命令为:

    复制代码 代码示例:

    >show variables like 'character%';

    +--------------------------+----------------------------+

    | variable_name | value |

    +--------------------------+----------------------------+

    | character_set_client | latin1 |

    | character_set_connection | latin1 |

    | character_set_database | latin1 |

    | character_set_filesystem | binary |

    | character_set_results | latin1 |

    | character_set_server | latin1 |

    | character_set_system | utf8 |

    | character_sets_dir | /usr/share/mysql/charsets/ |

    +--------------------------+----------------------------+

    从以上信息可知数据库的编码为latin1,需要修改为gbk或者是utf8;

    其中,

    character_set_client为客户端编码方式;

    character_set_connection为建立连接使用的编码;

    character_set_database数据库的编码;

    character_set_results结果集的编码;

    character_set_server数据库服务器的编码;

    只要保证以上四个采用的编码方式一样,就不会出现乱码问题。

    相关阅读:

    mysql默认编码修改方法

    修改mysql默认编码方法汇总

    mysql乱码问题 mysql编码转换方法

    mysql默认字符编码问题

    查看mysql数据库默认编码的方法

    查看mysql默认编码二种方法

    mysql编码查看命令与实例

    linux下mysql字符编码问题的解决方法

    修改mysql默认编码的方法(windows环境)

    mysql字符编码的问题

    mysql 编码设置一例

    2、linux系统下,修改mysql数据库默认编码的步骤为:

    2.1停止mysql的运行

    /etc/init.d/mysql start (stop) 为启动和停止服务器

    备注:也可以使用 service mysqld restart命令

    2.2mysql主配置文件为my.cnf,一般目录为/etc/mysql

    var/lib/mysql/ 放置的是数据库表文件夹,这里的mysql相当于windows下mysql的date文件夹

    当需要修改mysql数据库的默认编码时,需要编辑my.cnf文件进行编码修改,在linux下修改mysql的配置文件my.cnf,文件位置默认/etc/my.cnf文件

    (如果/etc/mysql/my.cnf下没有my.cnf,可在/usr/share/mysql拷贝一个.cnf 的文件,如my-small.cnf,重命名为my.cnf进行修改!)

    找到客户端配置[client] 在下面添加

    default-character-set=utf8 #默认字符集为utf8

    在找到[mysqld] 添加

    default-character-set=utf8 #默认字符集为utf8

    init_connect='set names utf8' #(设定连接mysql数据库时使用utf8编码,以让mysql数据库为utf8运行)

    修改好后,重新启动mysql 即可,重新查询数据库编码可发现编码方式的改变:

    复制代码 代码示例:

    >show variables like 'character%';

    +--------------------------+----------------------------+

    | variable_name | value |

    +--------------------------+----------------------------+

    | character_set_client | utf8 |

    | character_set_connection | utf8 |

    | character_set_database | utf8 |

    | character_set_filesystem | binary |

    | character_set_results | utf8 |

    | character_set_server | utf8 |

    | character_set_system | utf8 |

    | character_sets_dir | /usr/share/mysql/charsets/ |

    +--------------------------+----------------------------+

    此方法用于标准mysql版本同样有效,对于/etc/my.cnf文件,需要从mysql/support-files的文件夹cp my-large.cnf一份到/etc/my.cnf

    3、windows系统下可以删除mysql数据库,并重新安装,在安装过程中可以直接用mysql server instance config wizard 进行设置

    4、当mysql数据库服务器已经有数据不适合删除重装时,可以个别指定数据库的编码方式。

    mysql指定编码的方式是非常灵活并多样化的,可以指定表级别的编码,行级别编码,甚至可以指定字段级别的编码。

    创建数据库时指定编码的两种方式:

    复制代码 代码示例:

    create  database  ms_db  character set  utf8  collate utf8_general_ci;

    create  database  if  not  exists  netctoss  default character set utf8;

    5、如果你采用的是外部接入的方式,可以在连接中确定请求的编码格式如:

    jdbc:mysql://localhost:3306 /mysql?useunicode=true&characterencoding=utf-8

    注意:不要出现任何空格,否则出错。

    更多相关内容
  • 15种分类变量编码方法

    千次阅读 2021-02-16 11:04:34
    机器学习问题建模中,15种分类变量编码方法

    原文:HTML
    原题:All about Categorical Variable Encoding:Convert a categorical variable to number for Machine Learning Model Building
    作者:Baijayanta Roy
    翻译校对:datamonday



    在这里插入图片描述
    大多数机器学习算法都无法处理分类变量,需要将它们转换为数值。许多算法的性能会根据分类变量的编码方式而有所不同
    在这里插入图片描述
    以下是标量(Nominal variable)的一些示例:

    • Red, Yellow, Pink, Blue
    • Singapore, Japan, USA, India, Korea
    • Cow, Dog, Cat, Snake

    序数变量(Ordinal variables)的示例:

    • High, Medium, Low
    • “Strongly agree,” Agree, Neutral, Disagree, and “Strongly Disagree.”
    • Excellent, Okay, Bad

    可以通过多种方式将这些分类变量编码为数值,这篇文章将介绍从基本到高级的大多数内容,包含以下编码方法:

    1. One Hot Encoding
    2. Label Encoding
    3. Ordinal Encoding
    4. Helmert Encoding
    5. Binary Encoding
    6. Frequency Encoding
    7. Mean Encoding
    8. Weight of Evidence Encoding
    9. Probability Ratio Encoding
    10. Hashing Encoding
    11. Backward Difference Encoding
    12. Leave One Out Encoding
    13. James-Stein Encoding
    14. M-estimator Encoding
    15. Thermometer Encoder (To be updated)

    为了说明起见,我将使用此数据表格(DataFrame),其包含两个独立变量或特征(温度和颜色)和一个标签(目标)。 它还具有Rec-No,它是记录的序列号,共有10条记录。Python代码如下所示。

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    我们将使用Pandas和Scikit-learn和category_encoders(Scikit-learn贡献库)来显示Python中的不同编码方法。


    One Hot Encoding

    在这种方法中,将每个类别映射到一个包含1和0的矢量,表示该特征的存在与否。 向量的数量取决于特征类别的数量。如果该特征类别的数量非常多,则此方法会产生很多列,从而大大降低学习速度。 Pandas的 get_dummies 函数可以将分类变量编码为哑变量:

    在这里插入图片描述
    Scikit-learn中的 OneHotEncoder 类也可以实现,但它不会创建其他特征列。
    在这里插入图片描述
    独热编码(One Hot Encoding)非常流行。可以用N-1(N=类别数)来表示所有类别,因为这足以对没有包含的类别进行编码。通常,对于回归,使用N-1(放弃独热编码新特征的第一列或最后一列),但对于分类,建议使用所有N列,因为大多数基于树的算法都是基于所有可用变量建立一棵树。在线性回归中应该使用具有N-1个二元变量的一热编码,以确保正确的自由度数(N-1)。线性回归在训练的过程中,可以获得所有的特征,因此会完全检查整个虚变量集。这意味着N-1个二元变量给线性回归提供了原始分类变量的完整信息(完全代表)。这种方法可以用于任何在训练过程中同时考察所有特征的机器学习算法。例如,支持向量机和神经网络以及和聚类算法。

    在基于树的方法中,如果删除,将永远不会考虑该附加标签。 因此,如果在基于树的学习算法中使用分类变量,则比较好的做法是将其编码为N个二进制变量,并且不要丢弃。


    Label Encoding

    在这种编码中,为每个类别分配了一个从1到N的值(N为特征的类别数)。这种方法的一个主要问题是这些类别之间没有关系或顺序,但是算法可能会将它们视为但是算法可能会将它们视为某种顺序,或者存在某种关系。 在下面的示例中,它看起来像(Cold <Hot <Very Hot <Warm … 0 <1 <2 ❤️)。
    在这里插入图片描述
    Pandas的 factorize 也执行相同的功能。

    在这里插入图片描述


    Ordinal Encoding

    我们执行序数编码以确保变量的编码保留变量的序数性质。 正如我在本文开头提到的那样,这仅对序数变量合理。 这种编码看起来几乎与标签编码类似,但略有不同,因为标签编码不会考虑变量是否为序数,并且会分配整数序列

    • as per the order of data (Pandas assigned Hot (0), Cold (1), “Very Hot” (2) and Warm (3)) or
    • as per alphabetical sorted order (scikit-learn assigned Cold(0), Hot(1), “Very Hot” (2) and Warm (3)).

    如果我们以温度标尺为顺序,则顺序值应从“冷”到“非常热”。 顺序编码会将值指定为 ( Cold(1) <Warm(2)<Hot(3)<Very Hot(4))。 通常,我们从1开始进行序数编码。

    使用Pandas引用此代码,首先,需要通过字典分配变量的原始顺序。 然后按照字典映射变量的每一行。
    在这里插入图片描述
    尽管非常简单,但仍需要进行编码以告知序数值,以及按顺序从文本到整数的实际映射是什么。


    Helmert Encoding

    在此编码中,将某个级别的因变量的平均值与所有先前级别的因变量的平均值进行比较。

    category_encoders中的版本有时称为反向Helmert编码。 将某个级别的因变量平均值与之前所有级别的因变量平均值进行比较。因此,名称“reverse”用于区别于 forward Helmert编码。

    在这里插入图片描述


    Binary Encoding

    二进制编码将类别转换为二进制数字。 每个二进制数字创建一个特征列。 如果存在n个唯一类别,则二进制编码将导致仅有log(base 2)ⁿ 个特征。 在此示例中,有四个特征; 因此,二进制编码特征的总数将是三个特征。 与“独热编码”相比,这将需要较少的特征列(对于100个类别,“独热编码”将具有100个特征,而对于“二进制”编码,我们将仅需要七个特征)

    对于二进制编码,必须遵循以下步骤:

    • 首先,将类别转换为从1开始的数字顺序(顺序是在类别出现在数据集中时创建的,并不表示任何序数性质)
    • 然后,将这些整数转换为二进制代码,例如3变为011,4变为100。
    • 然后,二进制数的数字形成单独的列。

    请参考下图:
    在这里插入图片描述
    使用category_encoders包中的 BinaryEncoder 函数可以实现二进制编码。
    在这里插入图片描述


    Frequency Encoding

    这是一种利用类别的频率作为标签的方法在频率与目标变量有些相关的情况下,它可以帮助模型根据数据的性质以正比例和反比例理解和分配权重。 三个步骤:

    • 选择要转换的分类变量
    • 按类别变量分组并获得每个类别的计数
    • 将其与训练数据集重新结合

    在这里插入图片描述


    Mean Encoding

    平均编码或目标编码是Kagglers遵循的一种病毒(viral)编码方法。这有很多变化,我将介绍基本版本和平滑版本。平均编码与标签编码类似,只是这里的标签与目标直接相关。例如,在平均目标编码中,对于特征标签中的每一个类别,都是用目标变量在训练数据上的平均值来决定的。这种编码方法将相似类别之间的关系凸显出来,但联系被限定在类别和目标本身之内。平均目标编码的优点是不影响数据量,有助于加快学习速度。通常,Mean编码存在过拟合,因此,在大多数场合,使用交叉验证或其他方法进行正则化是必须的。平均数编码的方法如下:

      1. 选择要转换的分类变量。
      1. 按类别变量分组,并获得“目标”变量上的汇总和。 (“温度”中每个类别的总数为1)
      1. 按类别变量分组,并获得“目标”变量的总计数。
      1. 划分第2步/第3步的结果,然后将其与训练集合并。

    在这里插入图片描述
    代码实现:
    在这里插入图片描述
    均值编码可以在标签中体现目标,而标签编码与目标不相关。在具有大量特征的情况下,均值编码可能被证明是更简单的选择。均值编码倾向于对类别进行分组,而在标签编码的情况下,分组是随机的。

    实际上,此目标编码有多种变体,例如平滑。 平滑可以实现如下:

    在这里插入图片描述


    Weight of Evidence Encoding

    证据权重(WoE)是衡量分组技术区分好坏的“强度”的一种度量。 开发此方法主要是为了建立一种预测模型,以评估信贷和金融行业中的贷款违约风险。 证据权重(WOE)用于衡量证据支持或破坏假设的程度

    其计算方法如下:
    在这里插入图片描述
    如果P(Goods) / P(Bads) = 1,则WoE将为0。也就是说,该组的结果是随机的。 如果P(Bads) > P(Goods) ,则优势比将小于1,WoE将小于0; 另一方面,如果一组中的P(Goods) > P(Bads),则WoE> 0。

    WoE非常适合Logistic回归,因为Logit变换只是几率的对数,即 ln(P(Goods)/P(Bads))。 因此,通过在Logistic回归中使用WoE编码的预测变量,可以将所有预测变量准备和编码为相同的比例。线性逻辑回归方程中的参数可以直接比较。

    WoE转换具有(至少)三个优点:

    • 1)它可以转换自变量,以便与因变量建立单调关系。它所做的还不止于此:要确保单调关系,将其“重新编码”为任何有序的度量(例如1,2,3,4…)就足够了,但是WoE转换按“逻辑”规模对类别进行排序, Logistic回归很自然;
    • 2)对于具有太多(稀疏填充)离散值的变量,可以将它们分为几类(密集填充),并且WoE可以用于表示整个类别的信息;
    • 3)由于WoE是标准值,因此可以在类别和变量之间比较每个类别对因变量的(单变量)影响(例如,可以将已婚人员的WoE与体力劳​​动者的WoE进行比较)。

    它还(至少)具有三个缺点:

    • 1)由于归类为几个类别而导致的信息丢失;
    • 2)这是一个“单变量”量度,因此未考虑自变量之间的相关性
    • 3)根据类别的创建方式,很容易操纵(过拟合)变量的影响。

    下面代码片段说明了如何构建代码来计算WoE。
    在这里插入图片描述

    一旦为每个组计算WoE,我们就可以将其映射回Data-frame。
    在这里插入图片描述


    Probability Ratio Encoding

    概率比编码与证据权重(WoE)类似,唯一的区别是仅使用了好坏概率之比。 对于每个标签,我们计算target = 1的平均值,即平均值为 1 ( P(1) ),以及target = 0 ( P(0) )的概率。 然后,我们计算比率P(1)/P(0)并用该比率替换标签。我们需要为P(0)添加一个最小值,以避免任何除以零的情况,其中对于任何特定类别,没有target = 0。

    在这里插入图片描述
    在这里插入图片描述


    Hashing

    散列将分类变量转换为整数的高维空间,其中分类变量的两个向量之间的距离大致保持了变换后的数字维空间。 使用散列时,维度数量将远远少于像“独热编码”这样的编码方式的维度数量当分类的基数非常高时,此方法很有用


    Backward Difference Encoding

    在后向差分编码中,将一个级别的因变量的平均值与先前级别的因变量的平均值进行比较。 这种类型的编码对于标称或有序变量可能有用。

    该技术属于用于分类特征的对比度编码系统。 K个类别或级别的特征通常以K-1个虚拟变量序列的形式进入回归。


    Leave One Out Encoding

    这与目标编码非常相似,但是在计算某个级别的平均目标以减少离群值的影响时会排除当前行的目标。


    James-Stein Encoding

    对于特征值,James-Stein估计量返回的加权平均值为:

    1. 观察到的特征值的平均目标值。
    2. 平均目标值(与特征值无关)。
      James-Stein编码器将平均值缩小为总体平均值。 它是基于目标的编码器。 但是,James-Stein估计量有一个实际限制-仅针对正态分布进行了定义。

    M-estimator Encoding

    M-Estimate编码器是目标编码器的简化版本。 它只有一个超参数-m,代表正则化的功效。 m值越高,收缩越强。 m的推荐值在1到100的范围内。


    FAQ

    【常见问题解答01:我应该使用哪种方法?】

    答:没有适用于每个问题或数据集的单一方法。 你可能需要尝试一些才能看到效果更好的结果。 一般准则是参考文章末尾显示的备忘单。

    【常见问题解答02:如何针对情况(例如目标编码)创建分类编码,因为在测试数据中不会有任何目标值?】

    答:我们需要使用训练时创建的映射值。 此过程与缩放或规范化中的概念相同,在缩放或规范化中,我们使用训练数据来缩放或规范化测试数据。 W映射并在测试时间预处理中使用相同的映射。 我们甚至可以为每个类别和映射值创建一个词典,然后在测试时使用该词典。 在这里,我使用均值编码来解释这一点。

    Training Time
    在这里插入图片描述
    Testing Time
    在这里插入图片描述


    Conclusion

    对于所有机器学习模型,必须理解所有这些编码在所有情况下或对于每个数据集都无法正常工作。 数据科学家仍然需要进行实验,并找出最适合其特定情况的方法。 如果测试数据具有不同的类别,则其中某些方法将无法使用,因为功能将不相似。 研究社区的基准出版物很少,但不是结论性的,效果最好。 我的建议是尝试使用较小的数据集尝试每种方法,然后决定将重点放在调整编码过程上。 可以使用下面的备忘单作为指导工具。
    在这里插入图片描述

    展开全文
  • 作者:Eryk Lewinson 翻译:张睿毅 校对:张睿毅 本文约4200字,建议阅读10分钟本文我们主要使用非常知名的Python包,以及依赖于一个相对不为人知的scikit-lego包。标签:数据帧,精选, 机器学习, Python, 技术...

    80e2cde36db57682695950185d4935bf.png

    作者:Eryk Lewinson
    翻译:张睿毅
    校对:张睿毅
    
    
    本文约4200字,建议阅读10分钟本文我们主要使用非常知名的Python包,以及依赖于一个相对不为人知的scikit-lego包。

    标签:数据帧, 精选, 机器学习, Python, 技术演练

    e12cb86fe03066c4efbb160601585e93.png

    设置和数据

    在本文中,我们主要使用非常知名的Python包,以及依赖于一个相对不为人知的scikit-lego包,这是一个包含许多有用功能的库,这些功能正在扩展scikit-learn的功能。我们导入所需的库,如下所示:

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    from datetime import date
    from sklearn.linear_model import LinearRegression
    from sklearn.preprocessing import FunctionTransformer
    from sklearn.metrics import mean_absolute_error
    from sklego.preprocessing import RepeatingBasisFunction

    为了简单起见,我们使用自生成数据。在此示例中,我们使用人工时间序列。我们首先创建一个空的数据帧,其索引跨越四个日历年(我们使用pd.date_range)。然后,我们创建两列:

    • day_nr – 表示时间流逝的数字索引

    • day_of_year – 一年中的第一天

    最后,我们必须创建时间序列本身。为此,我们将两条变换的正弦曲线和一些随机噪声结合起来。用于生成数据的代码基于scikit-lego文档中包含的代码。

    # 避免重复
    np.random.seed(42)
    
    
    # 生成日期的数据格式
    range_of_dates = pd.date_range(start="2017-01-01",
                               End="2020-12-30")
    X = pd.DataFrame(index=range_of_dates)
    
    
    # 创建日期数据的序列
    X["day_nr"] = range(len(X))
    X["day_of_year"] = X.index.day_of_year
    
    
    # 生成目标成分
    signal_1 = 3 + 4 * np.sin(X["day_nr"] / 365 * 2 * np.pi)
    signal_2 = 3 * np.sin(X["day_nr"] / 365 * 4 * np.pi + 365/2)
    noise = np.random.normal(0, 0.85, len(X))
    
    
    # 合并获取目标序列
    y = signal_1 + signal_2 + noise
    
    
    # 画图
    y.plot(figsize=(16,4), title="Generated time series");

    4f24d56d57f1dcb015c023283cf15a9d.png

    图 1:生成的时间序列。

    然后,我们创建一个新的 DataFrame,在其中存储生成的时间序列。此数据帧将用于比较使用不同特征工程方法的模型性能。

    results_df = y.to_frame()
    results_df.columns = ["actuals "]

    创建与时间相关的要素

    在本节中,我们将介绍生成时间相关特征的三种老练方法。

    在我们深入研究之前,我们应该定义一个评估框架。我们的模拟数据包含四年的观察结果。我们将使用生成的前 3 年的数据作为训练集,并将在第4年进行评估。我们将使用平均绝对误差 (MAE) 作为评估指标。

    下面我们定义一个变量,该变量将用于分割两个集合:

    TRAIN_END = 3 * 365

    方法1:虚拟变量

    我们从您很可能已经熟悉的东西开始,至少在某种程度上是这样。对时间相关信息进行编码的最简单方法是使用虚拟变量(也称为单热编码)。

    6e432033ad3cef50ae94351aac875df2.png

    让我们看一个示例。

    X_1 = pd.DataFrame(
    data=pd.get_dummies(X.index.month, drop_first=True, prefix="month")
    )

    在下面,您可以看到我们操作的输出。

    95786635cf38384265edb8001630a9f0.png

    表 1:带有月份假人的数据帧。

    首先,我们从 DatetimeIndex 中提取有关月份的信息(编码为 1 到 12 范围内的整数)。然后,我们使用pd.get_dummies函数来创建虚拟变量。每列都包含有关观测值(行)是否来自给定月份的信息。

    您可能已经注意到,我们已经降低了一个级别,现在只有11列。我们这样做是为了避免在使用线性模型时可能出现的臭名昭著的虚拟变量陷阱(完美的多重共线性)问题。

    在我们的示例中,我们使用虚拟变量方法来获取观测值的月份。其实也可以使用相同的方法获取来自 DatetimeIndex 的一系列其他信息。例如,一年中的日/周/季度,给定一天是否为周末的标志,一个周期的第一天/最后一天等等。可以找到一个列表,其中包含所有可能的从pandas文档索引中提取的功能,可在 pandas.pydata.org找到。

    额外提示:以下已经不属于简单练习的范围了,但在现实生活中,我们还可以使用有关特殊日子的信息(想想国定假日,圣诞节,黑色星期五等)来创建功能。holidays是一个不错的Python库,包含每个国家/地区特殊日子的信息,无论过去和未来。

    如简介中所述,特征工程的目标是将复杂性从模型转移到特征集。这就是为什么我们将使用最简单的ML模型之一 -线性回归 – 展示一下拟合时间序列的程度,在我们仅使用创建的虚拟数据下。

    model_1 = LinearRegression().fit(X_1.iloc[:TRAIN_END], y.iloc[:TRAIN_END])
    
    
    results_df["模型_1"] = model_1.predict(X_1)
    results_df[["actuals","model_1"]].plot(figsize=(16,4),title="用月虚拟变量拟合")
    plt.axvline(date(2020, 1, 1), c="m", linestyle="--");

    be871e1181661568482a74f22b0ff421.png

    图 2:使用月份假人进行拟合。垂直线将训练集和测试集分开。

    我们可以看到,拟合线已经很好地遵循了时间序列,尽管它有点锯齿状(类似阶梯) - 这是由虚拟特征的不连续性引起的。因此我们将尝试通过接下来的两种方法解决此问题。

    但在继续之前,值得一提的是,当使用非线性模型(例如决策树(或其集合))时,别将诸如月份,或一年中的某天等特征显式编码设为随机数。这些模型能够学习序数输入特征与目标之间的非单调关系。

    方法#2:具有正弦/余弦变换的循环编码

    正如我们前面所看到的,拟合的线类似于步骤。这是因为每项虚拟数据都是单独处理的,没有连续性。然而,例如时间等变量存在明显的周期连续性。这意味着什么呢?

    想象一下,我们正在处理购买者的数据。当我们纳入观察到的购买者消费月份的信息时,如果连续两个月之间存在更强的联系,是有道理的。按照这个逻辑,12月和1月之间以及1月和2月之间的联系很强。相比之下,1月和7月之间的联系就并不那么紧密。这道理同样适用于其他与时间相关的信息。

    那么,我们如何将这些知识融入特征工程中呢?三角函数啊。我们可以使用以下正弦/余弦变换将循环时间特征编码为两个特征。

    def sin_transformer(period):
    return FunctionTransformer(lambda x: np.sin(x / period * 2 * np.pi))
    
    
    def cos_transformer(period):
    return FunctionTransformer(lambda x: np.cos(x / period * 2 * np.pi))

    在下面的代码片段中,我们复制初始 DataFrame,添加带有月份数字的列,然后  使用正弦/余弦变换对月份和day_of_year两项进行编码。然后,我们绘制两对曲线。

    X_2 = X.copy()
    X_2["月"] = X_2.index.month
    
    
    X_2["月_sin"] = sin_transformer(12).fit_transform(X_2)[" 月"]
    X_2["月_cos"] = cos_transformer(12).fit_transform(X_2)[" 月"]
    
    
    X_2["日_sin"] = sin_transformer(365).fit_transform(X_2)["每年的日"]
    X_2["日_cos"] = cos_transformer(365).fit_transform(X_2)[" 每年的日"]
    
    
    fig, ax = plt.subplots(2, 1, sharex=True, figsize=(16,8))
    X_2[["月_sin", "月_cos"]].plot(ax=ax[0])
    X_2[["日_sin", "日_cos"]].plot(ax=ax[1])
    plt.suptitle("用正余弦变换循环编码");

    4f7cd9d59f9e335ee3b02d9003e18c75.png

    图 3:基于每月和每日频率的正弦/余弦变换。

    如图 3 所示,我们可以从转换后的数据中得出两个知识。首先,我们可以很容易地看到,当使用月份进行编码时,曲线是阶跃的,但是当使用每日频率时,曲线要平滑得多;其次,我们也可以理解为什么我们必须使用两条曲线而不是一条曲线。由于曲线的重复性,如果在绘图中绘制一条单年水平直线,则会在两个地方穿过曲线。这还不足以让模型了解观测值的时间点。但是有了这两条曲线,就没有这样的问题,用户可以识别出每一个时间点。让大家看得更明白点,我们在散点图上绘制正弦/余弦函数的值。在图 4 中,我们可以看到一个圆的模式,没有重叠。

    b1be90bf42922491199d4f3a2d5d8741.png

    图 4:正弦和余弦变换的散点图。

    让我们仅使用来自每日频率的新创建要素来拟合相同的线性回归模型。

    X_2_daily = X_2[["day_sin", "day_cos"]]
    model_2 = LinearRegression().fit(X_2_daily.iloc[:TRAIN_END],y.iloc[:TRAIN_END])
    results_df["model_2"] = model_2.predict(X_2_daily)
    results_df[["actuals", "model_2"]].plot(figsize=(16,4), title="使用正弦/余弦特征拟合")
    plt.axvline(date(2020, 1, 1), c="m", linestyle="--");

    27da73f72c0c4afd22441f45aadf75c1.png

    图 5:使用正弦/余弦变换拟合。垂直线将训练集和测试集分开。

    图 5 显示,该模型能够拾取数据的总体趋势,识别具有较高和较低的周期。但是,预测的幅度似乎不太准确,乍一看,这种拟合似乎比使用第一种方法,虚拟变量,实现的拟合更差(图 2)。

    在我们讨论第三种特征工程技术之前,值得一提的是,这种方法存在一个严重的缺点,尤其会在使用基于树的模型时,缺点很明显。最初设计,基于树的模型就是基于当时的单个特征进行拆分。正如我们之前提到的,正弦/余弦特征应该同时考虑,以便正确识别一段时间内的时间点。

    方法#3:径向基函数

    最后一种方法使用径向基函数。我们不会详细介绍它们的实际情况,但您可以在此处阅读有关该主题的更多信息。从本质上讲,我们再次希望解决第一种方法遇到的问题,即我们的时间特征具有连续性。

    我们使用方便的scikit-lego库,它提供了RepeatmentBasisFunction类,并指定了以下参数:

    • 我们要创建的基函数的数量(我们选择:12个)。

    • 用于为 径向基函数(RBF)编制索引的列。我们这里采用的列是,该观测值来自一年中的哪一天。

    • 输入范围 – 我们这里,范围是从1到365。

    • 如何处理数据帧的其余列,我们将使用这些数据帧来拟合估计器。"drop"将仅保留创建的 RBF 功能,"passthrough "将保留旧功能和新功能。

    rbf = RepeatingBasisFunction(n_periods=12,
                             column="day_of_year",
                             input_range=(1,365),
                             remainder="drop")
    rbf.fit(X)
    X_3 = pd.DataFrame(index=X.index,
                   data=rbf.transform(X))
    
    
    X_3.plot(subplots=True, figsize=(14, 8),
         sharex=True, title="Radial Basis Functions",
         legend=False);

    f352f83b2a0deab9f5aecfd07d07c9d4.png

    图 6:12 个径向基函数。

    图 6 展示,我们使用日数作为输入,创建了 12 个径向基函数。每条曲线都包含有关多靠近本年某一天的信息(在选择此列的情况下)。例如,第一条曲线测量从1月1日开始的距离,因此它在每年的第一天达到峰值,在之后和当初升高的幅度对称地减小。

    根据设计,基函数在输入范围内的间距相等。我们选择了12,因为我们希望RBF类似于月份。这样,每个函数都会显示到月份第一天的距离(由于月份的长度不相等)。

    与前面的方法类似,让我们使用 12 个RBF 特征去拟合线性回归模型。

    model_3 = LinearRegression().fit(X_3.iloc[:TRAIN_END], y.iloc[:TRAIN_END])
    
    
    results_df["model_3"] = model_3.predict(X_3)
    results_df[["actuals", "model_3"]].plot(figsize=(16,4), title="使用RBF特征拟合")
    plt.axvline(date(2020, 1, 1), c="m", linestyle="--");

    12056b1d707b65f17e11ff58bb517545.png

    图 7:使用径向基函数拟合。垂直线将训练集和测试集分开。

    图 7 显示,当使用 RBF 功能时,该模型能够准确地捕获真实数据。

    使用径向基函数时,我们可以调整两个关键参数:

    • 径向基函数的数目,

    • 钟形曲线的形状 – 可以使用 RepeatingBasis 函数的宽度参数对其进行修改。

    调整这些参数值的一种方法是使用网格搜索来确定给定数据集的最佳值。

    最终比较

    我们可以执行以下代码段,以生成编码时间相关信息的不同方法的数字比较。

    results_df.plot(title="对比不同时间特征的拟合",figsize=(16,4), color = ["c", "k", "b", "r"])
    plt.axvline(date(2020, 1, 1), c="m", linestyle="--");

    ac2ee4d43abe59f60c975dd78a447e46.png

    图 8:使用基于不同时间特征获得的模型,比较拟合。垂直线分开的是训练集和测试集

    图 8 表明,径向基函数与所考虑的方法最接近。正弦/余弦特征允许模型拾取主要模式,但不足以完全捕获系列的动态。

    使用下面的代码段,我们计算每个模型在训练集和测试集上的平均绝对误差。我们预计训练集和测试集的分数之间非常相似,因为生成的序列几乎完全是周期性的 - 年份之间的唯一区别是随机分量。

    当然,在现实生活中情况并非如此,在现实中,随着时间的推移,我们会在同一时期之间遇到更多的变化。但是,在这种情况下,我们还会使用许多其他特征(例如趋势,或时间流逝的某种度量)来解释这些变化。

    score_list = []
    for fit_col in ["model_1", "model_2", "model_3"]:
    scores = {
        "model": fit_col,
        "train_score": mean_absolute_error(
            results_df.iloc[:TRAIN_END]["actuals"],
            results_df.iloc[:TRAIN_END][fit_col]
        ),
        "test_score": mean_absolute_error(
            results_df.iloc[TRAIN_END:]["actuals"],
            results_df.iloc[TRAIN_END:][fit_col]
        )
    }
    score_list.append(scores)
    
    
    scores_df = pd.DataFrame(score_list)
    scores_df

    与之前一样,我们可以看到使用RBF特征的模型产生了最佳拟合,而正弦/余弦特征的表现最差。我们对训练集和测试集所得分数之间的相似性假设也得到了证实。

    9580e0a043de0befa4342b56c800506d.png

    表 2:训练/测试集的分数 (MAE) 比较。

    总结

    • 我们展示了三种将时间相关信息编码为机器学习模型特征的方法。

    • 除了最流行的虚拟编码之外,还有一些方法更适合编码时间的循环性质。

    • 使用这些方法时,时间间隔的粒度对于新创建的要素的形状非常重要。

    • 使用径向基函数,我们可以决定要使用的函数的数量,以及钟形曲线的宽度。

    您可以在我的GitHub上找到本文中使用的代码。如果您有任何反馈,我很乐意在Twitter上讨论。

    引用

    [1] 时间相关的特征工程

    https://scikit-learn.org/stable/auto_examples/applications/plot_cyclical_feature_engineering.html

    [2] 预处理

    https://scikit-lego.readthedocs.io/en/latest/preprocessing.html

    [3] 时间/日期因素

    https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#time-date-components

    关于作者

    738b254f0441830095baae526603d34f.png

    Eryk Lewinson是一位具有定量金融背景的数据科学家。在他的职业生涯中,他曾在两家咨询公司工作,一家是金融科技规模的扩大公司,最近一次是在荷兰最大的在线零售商。在他的工作中,他使用机器学习为公司生成可操作的见解。目前,他将精力集中在时间序列预测领域。Eryk还出版了一本书 - Python for Finance Cookbook - 他在书中探讨了现代数据科学解决方案在定量金融领域的各种应用。他的书的第二版计划于2022年出版。在业余时间,他喜欢玩电子游戏,与女朋友一起旅行,并撰写与数据科学相关的主题。他的文章已被浏览超过250万次。

    原文标题:

    Three Approaches to Encoding Time Information as Features for ML Models

    原文链接:

    https://developer.nvidia.com/blog/three-approaches-to-encoding-time-information-as-features-for-ml-models/

    编辑:王菁

    校对:林亦霖

    译者简介

    f4d49aa83672c9ab32220ee1fecbcd3f.png

    大家好,我是Felix 张睿毅。之前大家可能看过我翻译的文章。而现在我希望通过自身的一些创新,让越来越多人喜欢我翻译的文章。同时从学问上,我个人希望让大家看到管卫东老师和唐瑭老师所致力引入的“叶斯柏森语法体系”在英语翻译上的效果。我仅代表接受这个语法体系的学生,但是我准备好了。

    翻译组招募信息

    工作内容:需要一颗细致的心,将选取好的外文文章翻译成流畅的中文。如果你是数据科学/统计学/计算机类的留学生,或在海外从事相关工作,或对自己外语水平有信心的朋友欢迎加入翻译小组。

    你能得到:定期的翻译培训提高志愿者的翻译水平,提高对于数据科学前沿的认知,海外的朋友可以和国内技术应用发展保持联系,THU数据派产学研的背景为志愿者带来好的发展机遇。

    其他福利:来自于名企的数据科学工作者,北大清华以及海外等名校学生他们都将成为你在翻译小组的伙伴。

    点击文末“阅读原文”加入数据派团队~

    转载须知

    如需转载,请在开篇显著位置注明作者和出处(转自:数据派ID:DatapiTHU),并在文章结尾放置数据派醒目二维码。有原创标识文章,请发送【文章名称-待授权公众号名称及ID】至联系邮箱,申请白名单授权并按要求编辑。

    发布后请将链接反馈至联系邮箱(见下方)。未经许可的转载以及改编者,我们将依法追究其法律责任。

    213534180a49e5ed0135d2eae4665367.png

    881f5bb4cd660f9df3914ba4d8b71918.png

    点击“阅读原文”拥抱组织

    展开全文
  • 栅格数据的编码方法

    万次阅读 2020-01-01 12:24:21
    直接栅格编码 直接编码就是将栅格数据看作一个数据矩阵,逐行(或逐列)逐个记录代码,可以每行从左到右逐像元记录,也可奇数行从左到右而偶数行由右向左记录,为了特定的目的还可采用其他特殊的顺序。 链式编码 ...

    直接栅格编码

    直接编码就是将栅格数据看作一个数据矩阵,逐行(或逐列)逐个记录代码,可以每行从左到右逐像元记录,也可奇数行从左到右而偶数行由右向左记录,为了特定的目的还可采用其他特殊的顺序。
    在这里插入图片描述

    链式编码

    链式编码又称为弗里曼链码(Freeman,1961)或边界链码。链式编码主要是记录线状地物和面状地物的边界。

    它把线状地物和面状地物的边界表示为:由某一起始点开始并按某些基本方向确定的单位矢量链。基本方向可定义为:东=0,东南=l,南=2,西南=3,西=4,西北=5,北=6,东北=7等八个基本方向。

    链式编码的前两个数字表示起点的行、列数,从第三个数字开始的每个数字表示单位矢量的方向,八个方向以0—7的整数代表。

    链式编码对线状和多边形的表示具有很强的数据压缩能力,且具有一定的运算功能,如面积和周长计算等,探测边界急弯和凹进部分等都比较容易,类似矢量数据结构,比较适于存储图形数据。

    缺点是对叠置运算如组合、相交等则很难实施,对局部修改将改变整体结构,效率较低,而且由于链码以每个区域为单位存储边界,相邻区域的边界则被重复存储而产生冗余。
    在这里插入图片描述

    游程长度编码

    游程长度编码是栅格数据压缩的重要编码方法,它的基本思路是:对于一幅栅格图像,常常有行(或列)方向上相邻的若干点具有相同的属性代码,因而可采取某种方法压缩那些重复的记录内容。其编码方案是,只在各行(或列)数据的代码发生变化时依次记录该代码以及相同代码重复的个数,或逐个记录各行(或列)代码发生变化的位置和相应代码,从而实现数据的压缩。

    游程长度编码在栅格加密时,数据量没有明显增加,压缩效率较高,且易于检索,叠加合并等操作,运算简单,适用于机器存贮容量小,数据需大量压缩,而又要避免复杂的编码解码运算增加处理和操作时间的情况。

    对于面状数据,游程长度编码还可以进行变长编码或值点编码。
    在这里插入图片描述

    块状编码

    块码是游程长度编码扩展到二维的情况,采用方形区域作为记录单元,每个记录单元包括相邻的若干栅格,数据结构由初始位置(行、列号)和半径,再加上记录单元的代码组成。

    一个多边形所包含的正方形越大,多边形的边界越简单,块状编码的效率就越好。**块状编码对大而简单的多边形更为有效,而对那些碎部较多的复杂多边形效果并不好。块状编码在合并、插入、检查延伸性、计算面积等操作时有明显的优越性。**然而对某些运算不适应,必须在转换成简单数据形式才能顺利进行。
    在这里插入图片描述

    四叉树编码

    四又树结构的基本思想是将一幅栅格地图或图像等分为四部分。逐块检查其格网属性值(或灰度)。如果某个子区的所有格网值都具有相同的值。则这个子区就不再继续分割,否则还要把这个子区再分割成四个子区。这样依次地分割,直到每个子块都只含有相同的属性值或灰度为止。

    也就是根据栅格数据二维空间分布的特点,将空间区域按照4个象限进行递归分割(2n×2 n,且n>1),直到子象限的数值单调为止,最后得到一棵四分叉的倒向树。四叉树分解,各子象限大小不完全一样,但都是同代码栅格单元组成的子块,其中最上面的一个结点叫做根结点,它对应于整个图形。不能再分的结点称为叶子结点,可能落在不同的层上,该结点代表子象限单一的代码,所有叶子结点所代表的方形区域覆盖了整个图形。从上到下,从左到右为叶子结点编号,最下面的一排数字表示各子区的代码。

    为了保证四叉树分解能不断的进行下去,要求图形必须为2n×2 n的栅格阵列。n 为极限分割次数,n+1是四叉树最大层数或最大高度。

    四叉树编码法的优点:①容易而有效地计算多边形的数量特征;②阵列各部分的分辨率是可变的,边界复杂部分四叉树较高即分级多,分辨率也高,而不需表示许多细节的部分则分级少,分辨率低,因而既可精确表示图形结构又可减少存贮量;②栅格到四叉树及四叉树到简单栅格结构的转换比其它压缩方法容易;④多边形中嵌套异类小多边形的表示较方便。

    四叉树编码的最大缺点是转换的不定性,用同一形状和大小的多边形可能得出多种不同的四叉树结构,故不利于形状分析和模式识别。但因它允许多边形中嵌套多边形即所谓“洞”这种结构存在,使越来越多的地理信息系统工作者都对四叉树结构很感兴趣。上述这些压缩数据的方法应视图形的复杂情况合理选用,同时应在系统中备有相应的程序。另外,用户的分析目的和分析方法也决定着压缩方法的选取。

    四叉树结构按其编码的方法不同又分为常规四叉树和线性四叉树。常规四叉树除了记录叶结点之外,还要记录中间结点。结点之间借助指针联系,每个结点需要用六个量表达:四个叶结点指针,一个父结点指针和一个结点的属性或灰度值。这些指针不仅增加了数据贮存量,而且增加了操作的复杂性。常规四叉树主要在数据索引和图幅索引等方面应用。

    线性四叉树则只存贮最后叶结点的信息。包括叶结点的位置、深度和本结点的属性或灰度值。所谓深度是指处于四叉树的第几层上。由深度可推知子区的大小。

    线性四叉树叶结点的编号需要遵循一定的规则,这种编号称为地址码,它隐含了叶结点的位置和深度信息。最常用的地址码是四进制或十进制的Morton码。

    在这里插入图片描述

    展开全文
  • 各种编码器的调零方法

    千次阅读 2021-01-15 03:28:07
    各种编码器的调零方法增量式编码器的相位对齐方式增量式编码器的输出信号为方波信号,又可以分为带换相信号的增量式编码器和普通的增量式编码器,普通的增量式编码器具备两相正交方波脉冲输出信号A和B,以及零位信号...
  • GIS游程编码两种方法

    千次阅读 2020-12-10 22:27:12
    GIS游程编码两种方法 网上都搜不到两种方法,一般都只写了第一种,我来补充!~ 举例:AAAABBBCCD 第一种方法:按照长度来标记 (A,4)(B,3)(C,2)(D,1) 第二种方法:按照最后一位位置来标记 (A,4)(B,7)(C,9...
  • 伺服电机编码器调零对位方法

    千次阅读 2020-12-29 04:47:27
    伺服电机编码器调零对位方法伺服电机在拆开检查的时候,有时因为不小心将电机尾部固定的编码器也拆下来了,那要怎么办呢?因为伺服电机编码器动过位置了,编码器原点漂移了,所以需要重新校正。具体如下:应急调零...
  • 数据压缩编码方法

    万次阅读 2016-12-18 12:57:55
    变换编码一般只解除矢量内部的相关性,但它可有许多可供选择的变换方法,以适应不同的信源特性。 一、预测编码: 若有一个离散信号序列,序列中各离散信号之间有一定的关联性,则利用这个序列中若干个信号作为依据
  • 统计学习-统计编码方法简介 机器学习常见的编码方法简介 在实际的问题中,经常会遇到自变量是分类变量的问题,比如血型、学历、职称级别、衣服型号等。在处理这些变量的时候,通常会对变量进行编码处理,使得原来的...
  • 信息论与编码

    万次阅读 2018-06-05 01:42:03
    编码信息论里分为两大块,一块是信道编码,一块是信源编码。(一)信道编码 1. 香农有噪信道编码定理香农有噪信道编码定理指出一个令人惊叹的事实,尽管噪声会带来干扰,我们还是可以以任意小的错误概率传送数据...
  • 微指令编码方法(组原)

    千次阅读 多人点赞 2021-01-06 16:12:11
    微程序控制器–常用的微指令编码方法 1.直接控制法(不译法) 微指令操作控制字段的每一位都直接表示一个微命令,该位为“1”,表示执行这个微命令。 优点:结构简单,并行性强,无需译码,速度快。 缺点:微指令字...
  • 信源编码与信道编码区别(十一)

    千次阅读 2021-06-02 17:55:43
    但现代通信应用中常见的信源编码方式有:Huffman编码、算术编码、L-Z编码,这三种都是无损编码,另外还有一些有损的编码方式。信源编码的目标就是使信源减少冗余,更加有效、经济地传输,最常见的应用形式就是压缩。...
  • 一、 数字数据 编码 数字信号、 二、 非归零编码 ( NRZ )、 三、 归零编码 ( RZ )、 四、 反向不归零编码 ( NRZI )、 五、 曼彻斯特编码、 六、 差分曼彻斯特编码、 七、 4B/5B 编码
  • 但现代通信应用中常见的信源编码方式有:Huffman编码、算术编码、L-Z编码,这三种都是无损编码,另外还有一些有损的编码方式。信源编码的目标就是使信源减少冗余,更加有效、经济地传输,最常见的应用形式就是压缩。...
  • 之前弄明白了信息熵是什么,由于信息熵来源于信息论,要怎么才能跟编码联系起来呢?这个问题当时没有想明白,今天查了一下资料,理解了一下,做笔记整理一下,如有错误欢迎指正。如果信息熵不明白的请看这里:...
  • ICASSP2021:端到端的图像编码方法

    万次阅读 2021-08-15 17:34:06
    基于深度学习的计算机视觉在图像领域应用越来越广泛,每天产生的图像数量爆发式增长,传统的图片编码器是面向人眼视觉而不是机器处理。本文提出基于神经网络(NN)的端到端学习的面向机器的图像编码器(Image Coding...
  • ERP标准物料编码规则及方法

    万次阅读 2017-08-01 10:31:56
    物料档案(存货档案)的整理与系统录入是ERP实施过程中非常重要的一个基础数据准备与完成工作之一,...说明:以物料的编码为主线讲解编码的原则,但所讲编码原则同样适用于系统的客户编码、供货商编码、职员编码、部门
  • 信息分类编码

    千次阅读 2013-03-05 09:16:28
    在现代社会中,信息分类和编码是提高劳动生产率和科学管理水平的重要方法。美国新兴管理学的开创者莫里斯L· 库克(Morris L· Cooker)说:"只有当我们学会了分类和编码,做好简化和标准化工作,才会出现任何
  • 本发明涉及工业自动化和智能机器人领域,特别涉及一种伺服系统零点校对的绝对值编码器调零方法。背景技术:随着经济的发展和生活水平的提高,为了满足工厂自动化的生产,工业机器人代替人类进行恶劣环境工况和重复性...
  • 1. 信道编码技术在移动通信中的应用 蜂窝移动通信系统在过去几十年中迅猛发展,使得用户彻底摆脱终端设备的束缚,变成社会发展和进步的必不可 可少的工具。纠错编码作为不可或缺的一环,在移动通信系统中有着广泛的...
  • 基于信息论的编码技术

    千次阅读 2018-11-21 09:51:55
    信息论是通过应用密码学、概率论、信息熵、通信系统、随机过程等方法,来研究信息的传输、提取和处理系统的一门学科。而编码技术研究的主要内容是如何既可靠又有效地传输信息。1948年香农在《贝尔系统技术杂志》上...
  • 主数据及编码

    千次阅读 2020-01-26 12:03:40
    早期以 ERP 为代表的制造业集成应用系统的发展过程中,产生了信息孤岛和数据处理危机问题。为了解决这些问题,主数据这个概念随之诞生。 目前,对主数据的定义没有统一,一些 MDM 产品提供商和学者提出了各自对主...
  • linux shell 中文件编码查看及转换方法 vim shell文件编码中文乱码  一、查看文件编码。  在打开文件的时候输入:set fileencoding  即可显示文件编码格式。二、文件编码转换  1、在Vim中直接进行转换文件编码...
  • Positonal Encodings in ViTs 近期各视觉Transformer中的位置编码方法总结及代码解析 最近CV领域的Vision Transformer将在NLP领域的Transormer结果借鉴过来,屠杀了各大CV榜单。对其做各种改进的顶会论文也是...
  • 材料编码是基础中的基础
  • URL编码/解码详解

    千次阅读 2022-03-10 12:04:23
    URL编码/解码详解 当 URL 路径或者查询参数中,带有中文或者特殊字符的时候,就需要对 URL 进行编码(采用十六进制编码格式)。URL 编码的原则是使用安全字符去表示那些不安全的字符。 安全字符,指的是没有特殊用途...
  • 解决方法: (1)均匀编码: 将原本“信源的符号数为L,每J个符号一组来编码”产生的序列集数目LJ减少至典型序列TS(J,ε)的数目a。 利用典型序列大概率的特性,我们就有可能在允许传输一定失真的...
  • 信道编码与信源编码基本

    千次阅读 2021-07-07 11:03:07
    具体说,就是针对信源输出符号序列的统计特性来寻找某种方法,把信源输出符号序列变换为最短的码字序列,使后者的各码元所载荷的平均信息量最大,同时又能保证无失真地恢复原来的符号序列。其作用有二:一是数据压缩...
  • 如果计算机键盘内的编码器是前面所讲的普通编码器,当同时按下两个按键时,键盘内的编码器将不能对这种输入状态进行编码,会出现错误的信息。这种错误信息有时会出现致命的后果。为了使这种输入状态出现时编码企业有...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,009,779
精华内容 403,911
热门标签
关键字:

信息编码的方法