精华内容
下载资源
问答
  • 特征转换

    千次阅读 2018-11-16 15:39:13
    特征转换就是对原始的特征变量进行转换处理,主要的原因是算法的需要,常做的特征转换有: 标准化处理:把特征变量转换成均值为0,方差为1 归一化处理:把特征变量转换为最小值为0,最大值为1 正则化处理:将每个...

    特征转换就是对原始的特征变量进行转换处理,主要的原因是算法的需要,常做的特征转换有:

    1. 标准化处理:把特征变量转换成均值为0,方差为1
    2. 归一化处理:把特征变量转换为最小值为0,最大值为1
    3. 正则化处理:将每个样本在所有变量上的值缩放到单位范数(即每个样本在所有变量上的值的范数为1)
    4. 特征编码:例如常用的独热编码
    展开全文
  • 特征工程——特征转换

    千次阅读 2018-06-14 13:09:06
    特征转换 一、连续型变量 1.1 连续变量无量纲化 无量纲化: 使不同规格尺度的数据转化统一规格尺度(将数据单位统一) 无量纲化方法:标准化, 区间所方法 标准化: 将连续性变量转变为 均值0 标准差1 的...

    这里写图片描述

    一、连续型变量

    1.1 连续变量无量纲化
    无量纲化: 使不同规格尺度的数据转化统一规格尺度(将数据单位统一)
    无量纲化方法:标准化, 区间所方法 
    
    标准化: 将连续性变量转变为 均值0 标准差1 的变量
    x=xx¯¯¯σ     x¯¯¯σ x ′ = x − x ¯ σ           其 中 x ¯ 是 均 值 , σ 是 标 准 差
    代码:                                 #对 Amount字段--均值为0,方差为1标准化
    from sklearn import preprocessing
    std = preprocessing.StandardScaler()  #StandardScaler
    Amount = RFM['Amount'].values.reshape(-1,1)
    std.fit(Amount)
    RFM['Amount_std'] = std.transform(Amount)
    RFM.head(5)

    区间缩放法:把原始的连续型变量转换为范围在[a,b]或者 [0,1] 之间的变量

    x=xmin(x)max(x)min(x) x ′ = x − m i n ( x ) m a x ( x ) − m i n ( x )

    代码:                                       #对 Amount字段--[0,1]区间归一化 
    from sklearn import preprocessing
    MinMaxscaler = preprocessing.MinMaxscaler()  #MinMaxscaler
    Amount = RFM['Amount'].values.reshape(-1,1)
    MinMaxscaler.fit(Amount)                     #拟合(训练)
    RFM['Amount_range'] = MinMaxscaler.transform(Amount)
    RFM.head(5)
    1.2 连续变量数据变换
    数据变换:通过函数变换改变原始数据的分布
    目   的: 数据从无关系 -> 有关系
             呈偏态分布-->变换后差异拉开
             让数据符合模型理论所需要的假设,然后对其分析,例如:变换后数据呈正态分布
    
    数据变化方法:
    logX,Ine 等 对数函数变换 x=ln(x) x ′ = l n ( x )
    box-cox 变换 :自动寻找最佳正态分布变换函数的方法

    这里写图片描述

    代码1#对 Amount字段--log 变换
    import numpy as np
    RFM['Amount_log'] = np.log(RFM['Amount'])
    RFM,head(5)
    
    代码2#对 Amount字段--sqrt (平方根) 变换
    import numpy as np
    RFM['Amount_sqrt'] = np.sqrt(RFM['Amount'])
    RFM,head(5)
    1.3 连续变量离散化
    目的:方便探索数据相关性
          减少异常数据对模型的干扰
          为模型引入非线性,提升模型预测能力
          离散后,可进行特征交叉组合,又M+N 变成 M*N
    数据离散化方法:
        非监督离散方法:
            自定义规则,
            等宽方法,
            等频/等深方法 
    非监督离散方法:
     #对 Amount字段--自定义区间 离散化
            cut_points = [0,200,500,800,1000]
            RFM['Amount_bin'] = pd.cut(RFM['Amount'],bin = cut_points)
            RFM,head(5)
     #对 Amount字段--等宽 离散化
            RFM['Amount_width_bin'] = pd.cut(RFM.Amount,20) #分成20等分
            RFM,head(5)
            grouped = RFM.groupby('Amount_width_bin')
            grouped['CardID'].count()
     #对 Amount字段--等深 离散化
            RFM['Amount_depth_bin'] = pd.qcut(RFM.Amount,5) #分成5人的等分约20%
            RFM,head(5)
            grouped = RFM.groupby('Amount_depth_bin')
            grouped['CardID'].count()
    有监督离散方法:决策树
    离散化后的目标分类纯度最高(对目标有很好的区分能力)
    一种特殊的离散化方法:
        二值化:           把连续型变量分割为0/1(是/否) 例如:是否大于18岁(是/否)
        Rounding(取整): 本质上时一种类似‘等距方法’的离散
    

    二、类别变量编码

    类别变量编码:
    类别型变量—-编码成—> 数值型变量
    目的:
    机器学习算法 无法处理类别型变量,必须转换为数值型变量
    一定程度起到了扩充特征的作用(构造了新的特征)
    one-hot encoding 独热编码
    dummy encoding 哑变量编码
    label-encoding 标签编码
    count-Encoding 频数编码 (可以去量纲化,秩序,归一化)
    Target encoding 二分类 用目标变量中的某一类的比例来编码
    代码:
    import pandas as pd                    #导入的数据源于 特征构造
    trade = pd.read_csv('./data/transaction.txt')
    trade['Date'] = pd.to_datetime(trade['Date'])
    RFM = trade.groupby('CardID').egg({'Date':'max','CardID':'count','Amount':'sum'})
    RFM.head()
    
    --------------Onehot 编码(独热编码)使用pandas------------------
    onehot = pd.get_dummies(RFM['CardID']),drop_first = False,prefix = 'Freq'
    
    onehot.head()
        from sklearn import preprocessing      #使用sklearn 导入OneHotEncoder
        onehot = preprocessing.OneHotEncoder() #OneHotEncoder
        Freq = RFM['CardID'].values.reshape(-1,1)
    onehot.fit(Freq)
        Freq_onehot = onehot.transform(Freq).toarray()
        Freq_onehot
        df = pd.DataFrame(Freq_onehot)         #将array 转为pandas 的dataframe
        df.head()

    三、时间型、日期型变量转换

    代码:
    import pandas as pd
    data = pd.DataFrame({'data_time':pd.date_range('1/1/2017 00:00:00',period = 12,freq = 'H'),'data':pd.date_range('2017-1-1',period = 12,freq = 'M')
    })
    
    ■ data:提取日期型和时间型的特征变量
    data['year']= data['data_time'].dt.year
    data['month'] = data['data_time'].dt.month
    data['day'] = data['data_time'].dt.day
    data['hour'] = data['data_time'].dt.hour
    data['minute'] = data['data_time'].dt.minute
    data['second'] = data['data_time'].dt.second
    data['quarter'] = data['data_time'].dt.quarter
    data['week'] = data['data_time'].dt.week
    data['yearmonth'] = data['data_time'].dt.strftime('%Y-%m')
    data['halfyear'] = data['data_time'].mapa(lambda d:'H' if d.month <= 6 else 'H2')data:转换为相对时间特征
    import datetime
    data['deltaDayToToday'] = (datetime.date.today()-data['date'].dt.date).dt.days  #距离今天的间隔(天数)
    data['deltaMonthToToday'] = datetime.date.today().month - data['date'].dt.month #距离今天的间隔(月数)
    data['daysOfyear'] = data['date'].map(lambda d:366 if d.is_leap_year els 365)   #一年过去的进度
    data['rateOfyear'] = data['date'].dt.dayofyear/data['daysOfyear']
    data.head()

    四、 缺失值处理

    删除缺失值记录 缺失值替换:
    用0替换
    平均数替换
    众数替换
    预测模型替换
    构造 NaN encoding 编码
    构造一个新的字段来标识是否有缺失(1/0) 任何时候都可使用
    import pandas as pd
    titanic = pd.read_csv('./data/titanic.csv')
    titanic.info()
    
    age_mean = round(titanic['Age'].mean())        #对缺失值进行填充
    titanic['Age'].fillna(age_mean,inplace = True) #填充平均年龄
    titanic.info()
    
    titanic = pd.read_csv('./data/titanic.csv')    #构造缺失值的标志变量(0/1)
    titanic.info()
    titanic['Age_ismissing'] = 0
    titanic.loc[titanic['Age'].isnull(),'Age_ismissing'] = 1
    titanic['Age_ismissing'].value_counts()

    五、 特征组合

    目的:
    构造更多更好的特征,提升模型精度(例如:地球仪的经纬密度)
    方法:
    多个连续变量: 加减乘除运算
    多个类别型变量: 所有值交叉组合
    import pandas as pd 
    titanic = pd.read_csv('./data/titanic.csv')
    titanic.head()
    
    # 组合特征
    titanic['Sex_pclass_combo'] = titanic['Sex']+'_pclass_'+titanic['Pclass'].astype(str)
    titanic.Sex_pclass_combo.value_counts()
    
    # onehot编码
    Sex_pclass_combo = pd.get_dummies['Sex_pclass_combo'],drop_first = False,prefix = 'onehot'
    Sex_pclass_combo.head()
    展开全文
  • 一种基于FPGA的尺度不变特征转换算法
  • matlab开发-筛选比例变化特征转换。它为输入图像生成筛选关键点和描述符。
  • 语音不匹配条件下说话人验证的特征转换
  • 基于特征转换的CAD_CAPP集成技术研究.pdf
  • matlab开发-筛选比例变化特征转换算法。此代码为给定图像提供筛选键及其描述符。
  • 基于尺度不变特征转换与局部相位量化结合的人脸识别.pdf
  • 现在我理解的特征工程的意义是:如何把非数值特征转换成数值特征? 1、假如有一个属性是职业,有这三种职业,教师、公务员、工程师,现在要用一个基于线性回归的算法,来训练模型,假如f(x,y)=ax+by,a,b代表权重,x...

    现在我理解的特征工程的意义是:如何把非数值特征转换成数值特征?
    1、假如有一个属性是职业,有这三种职业,教师、公务员、工程师,现在要用一个基于线性回归的算法,来训练模型,假如f(x,y)=ax+by,a,b代表权重,x代表职业这个属性值,那么如何给这个x赋值?

    解决方案:
    1、人工无脑的赋值,比如教师=1,公务员=2,工程师=3,但是这样科学吗?假设教师和工程师的特征比较相似,这样显然不合适。但是,这种方法依然在用,解决这种不合理的办法是,世界上有许多计算词汇相似度的方法,他能判别各种词汇的相似度,我们根据词汇相似度然后再给他们赋值。
    2、离散赋值,比如把职业这个属性再分为三类
    特征工程

    展开全文
  • 下面介绍的是用pands读取泰坦尼克遇难船员的数据,然后挑选特征,补全缺失值,特征转换。1.pands读取数据titanic=pd.read_csv('./titanic.txt')其数据形式如下: row_num pclass survived name age ...

    下面介绍的是用pands读取泰坦尼克遇难船员的数据,然后挑选特征,补全缺失值,特征转换。

    1.pands读取数据

    titanic=pd.read_csv('./titanic.txt')
    

    其数据形式如下:
    |row_num |pclass|survived|name|age|embarked|home.dest|room|ticket|boat|sex|
    | -------- | :----: |
    |3|1st|0|Allison|30.|Southampton|Montreal|C26||(135)|male|

    使用Pandas读入的数据都有pandas独有的dataframe格式,使用info()可查看数据的统计特性

    print titanic.info()
    
    >>
    >>
    RangeIndex: 1313 entries, 0 to 1312 #数据集一共有1313个样本0-1312
    Data columns (total 11 columns): #一共有11列
    row.names    1313 non-null int64 #有1313个,类型为整型
    pclass       1313 non-null object #有1313个,类型对象型,如字符串
    survived     1313 non-null int64 #有1313个,类型为整型
    name         1313 non-null object #有1313个,类型为对象
    age          633 non-null float64 #有633个(即有680个缺失值)
    embarked     821 non-null object # 以下同理,不表
    home.dest    754 non-null object
    room         77 non-null object
    ticket       69 non-null object
    boat         347 non-null object
    sex          1313 non-null object
    dtypes: float64(1), int64(2), object(8)
    

    2.挑选特征

    我们知道,在原始数据集中,并不是所有的特征对于训练都有用;所以我们就要根据相关背景来进行筛选。此处我们选取sex,age,pclass这三个维度的特征用于训练。

    X=titanic[['pclass','age','sex']]
    y=titanic['survived']
    print X
    
    >>
    >>
         pclass      age     sex
    0       1st  29.0000  female
    1       1st   2.0000  female
    2       1st  30.0000    male
    3       1st  25.0000  female
    4       1st   0.9167    male
    5       1st  47.0000    male
    6       1st  63.0000  female
    7       1st  39.0000    male
    8       1st  58.0000  female
    9       1st  71.0000    male
    10      1st  47.0000    male
    11      1st  19.0000  female
    ...     ...      ...     ...
    
    
    print X.info()
    
    >>
    >>
    [1313 rows x 3 columns]
    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 1313 entries, 0 to 1312
    Data columns (total 3 columns):
    pclass    1313 non-null object
    age       633 non-null float64
    sex       1313 non-null object
    dtypes: float64(1), object(2)
    memory usage: 30.8+ KB
    

    此时我们可以看到,X中就只有三个维度了;但从X.info()中我们可以看出:
    ①维度age中仍然有缺失值,需要补全;
    ②维度pclass和sex维度均为对象值,要进行特征转换;

    3.缺失值补全

    首先我们需要补充age里的数据,通常使用平均数或者中位数都是对模型偏离造成最小影响的策略。

    X['age'].fillna(X['age'].mean(),inplace=True)
    
    print X.info()
    
    >>
    >>
    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 1313 entries, 0 to 1312
    Data columns (total 3 columns):
    pclass    1313 non-null object
    age       1313 non-null float64
    sex       1313 non-null object
    dtypes: float64(1), object(2)
    memory usage: 30.8+ KB
    

    可以看到,此时已经不存在缺失值了。

    4.特征转换

    先解释一下特征转换,我们知道对象类型的数据是无法进行计算的,所有我们就需要将其转换成其他形式;最直接的就是转换成0,1值,比如性别这个维度就可以用0,1来代替。但是如果有三种类型呢?比如某个维度有great,good,bad有三种取值,那么该如何转换呢?这儿用到的方法就是将这一个维度展开成三个维度,即great,good,bad分别构成一个维度,每个维度都用0,1取值来处理。

    X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=33)#在进行特征转换之前,我们先对数据集进行切分
    
    
    vec=DictVectorizer(sparse=False) #sparse=False意思是不用稀疏矩阵表示
    X_train=vec.fit_transform(X_train.to_dict(orient='record'))
    X_test=vec.transform(X_test.to_dict(orient='record'))
    
    print vec.feature_names_ #查看转换之后的特征维度
    print X_train # 转换后的训练集
    
    >>
    >>
    ['age', 'pclass=1st', 'pclass=2nd', 'pclass=3rd', 'sex=female', 'sex=male']
    
    [[ 31.19418104   0.           0.           1.           0.           1.        ]
     [ 31.19418104   1.           0.           0.           1.           0.        ]
     [ 31.19418104   0.           0.           1.           0.           1.        ]
     ..., 
     [ 12.           0.           1.           0.           1.           0.        ]
     [ 18.           0.           1.           0.           0.           1.        ]
     [ 31.19418104   0.           0.           1.           1.           0.        ]]
    
    
    

    此时我们就等到了处理好的完整的数据集,就可以将其用于训练了。

    源码

    参考:

    • Python机器学习及实践

    更多内容欢迎扫码关注公众号月来客栈!
    在这里插入图片描述

    展开全文
  • 什么是特征转换特征转换就是将原始资料(不容易数据化)转换为有意义的资料(能够数据化),或者说是计算机能够处理的资料。比如说我们可以将像素点转换为一些有强度特制的,对称性的资料以便我们从中找出规律。还...
  • SIFT算法的全称是Scale-invariant feature transform,尺度不变特征转换,是一种不随图像尺度旋转变化而变化的特征,因此SIFT特征不会随着图像的放大缩小,或者旋转而改变,同时由于在提取特征时做的一些特殊处理,...
  • 机器学习中,神经网络是如何将线性不可分的样本,进行很好的分类的? 如上图所示,左图中的蓝色的圆圈和红色的叉叉是线性...特征转换 : 如上图所示,我们将x-空间的特征,转换为z-空间中的特征。 在左图x-空间中,...
  • OPENCV SIFT提取出来的特征维度太高,特征点数目也...但是本人在这方面纯属小白,求一份OpenCV SIFT特征转换为LSH(局部敏感哈希)的代码,最好是java的,C++的话也是可以的,不胜感激!!! 邮箱:891918144@qq.com
  • 特征选择其实是特征转换的子集。 PCA: ICA: RCA: LDA:
  • 特征抽取 TF-IDF TF-IDF一般应用于文本挖掘中,用来反映一个特征项的重要性。设特征项为 t,文档为d,文档集为D。特征频率( term frequency)TF(t,d) 为特征项在文档d中出现在次数。 文档频率(document frequency)...
  • 声学特征转换 kaldi工具

    千次阅读 2017-11-12 16:32:32
    基本工具1.transform-featstransform-feats <transform> <input-feats> 其中transform是对应的特征转化矩阵,如果transform是rxfilename形式,认为是speaker-independent;如果transform是rspecifier形式,有-utt2...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 381,790
精华内容 152,716
关键字:

特征转换