Question 1000316: 请问NLP中这种编码方式有没有什么术语?
统计/机器学习 自然语言处理 数据预处理比如说,
今 天 比 昨 天 冷
然后对每个字从1开始编号
1 2 3 4 2 5
然后每个字写成一个长度为5的向量,对应编号的位置为1,其他为0.
[1, 0, 0, 0, 0]
[0, 1, 0, 0, 0]
[0, 0, 1, 0, 0]
[0, 0, 0, 1, 0]
[0, 1, 0, 0, 0]
[0, 0, 0, 0, 1]
这种编码有没有什么术语?
Answer
术语是One-hot encoding,中文翻译为独热编码。
在对categorical feature(分类特征)进行预处理的时候,不只是NLP,这个方法在回归、分类、聚类中都很常用。
Question 1000355: 训练集中有的特征含有缺失值,一般怎么处理
统计/机器学习 数据预处理训练集样本中有的数值特征列含有缺失值,一般怎么处理?我一般都是取这一列的平均值,有更好的方法,或者其他可行的方法吗?
Answer
1. 替代法
用该列的中位数或者平均值或者众数来代替这列中所有的缺失值。也可以从这一列中随机抽样(bootstrap)。
对于时间序列变量,可以用插值的方法。
这个方法的缺点是让数据增加了很多noise。
2. 预测法
把这一列当成标签,用剩下变量来预测缺失值。
一般用比较简单的模型,比如可以用kNN,regression tree。
这个方法的缺点是引入了偏差。
3. 消极处理
如果某一行的缺失值很多,就把这一行删了。
如果某一列的缺失值很多,就把这一列删了。
或者直接不处理,有些模型,比如random forest,可以直接处理有缺失值的数据。
先看看缺失值多不多,如果这一变量里面95%都是缺失的,我觉得这一列的参考意义也不会大,不如就把这一列给删掉。
对于数值变量(numeric)来说,可以用平均值来代替。
对于分类变量(categorical)来说,可以把缺失值统一当作一个新的分类来处理。
说句我的实战经验,如果数据是来自自家公司的数据库,那以上方法都不是最有效的。最有效的方法是去找负责数据库的码农同志聊一聊。标本兼治,药到病除。
从实际角度出发,首先要了解缺失的原因;其次,看缺失值和预测值的联合分布,看看其中有没有什么蹊跷。
从处理的角度来说,如题主说到的,
- 可以用均值,也可以用众数,中位数;
- 可以按类的均值(众数、中位数)补全,比如说数据中A列中的数值有缺失,B列是一个categorical variable,你可以按照B列中的类别,用类别的均值对A列中的数据补全。
直接看这个链接就完事了,清晰明了
ps 我的实际经验是在imputing的时候用MCMC sampling或者Random Forest的效果很棒,尤其推荐mice 这个package
Question 1000357: 在数据预处理阶段,特征的标准化有哪些方法?
统计/机器学习 数据预处理特征的标准化具体是什么意思?
Answer
特征标准化(Feature Standardization)的作用是将样本数据中的每一列特征缩放到一个统一的尺度。方法有很多种,我列几个最常用的。
1. 最大值最小值标准化
$$x'=\frac{x-\min}{\max - \min}.$$
$x$是原始数值,$x'$是标准化之后的数值。标准化之后,该列所有的数都将会在$[0,1]$之间。当然我们可以稍作调整,把数据缩放到$[-1,1]$的尺度上。
$$x'=\frac{x-m}{\max - m},$$
其中$m=(\max + \min)/2$。注意以上提到的最大值、最小值,都是指该列的最大值、最小值。
2. 正态标准化
$$x'=\frac{x-\mu}{\sigma}.$$
其中$\mu$和$\sigma$分别是这列数据的均值和标准差。这个过程就和把一个正态分布标准化的过程是一样的,所以也称作正态标准化(Normalization)。根据正态分布的$3\sigma$-原则,我们可以预计,在正态标准化之后,比较接近正态分布的数据在标准化后基本上都会在$[-3,3]$之间。
3. 分位数标准化
$$x'=\frac{x-Median}{IQR}.$$
其中$IQR$是四分位距,也就是第三四分位(3rd quartile)和第一四分位(1st quartile)的差,Median是这一列的中位数。分位数标准化后的数据尺度和数据本身的分散程度相关,但是通常也是在$[-3,3]$的范围内。
4. 范数标准化
$$x'=\frac{x}{\|X\|}.$$
$X$是这一列所有的数,$\|X\|$是这一列的范数,可以取1-范数,也可以取2-范数。对特征进行范数标准化之后,这列所有的数值都会是在$[-1,1]$之间。
Question 1000375: PCA降维之前为什么要先标准化?
统计/机器学习 数据预处理 数据降维当数据维数很高的时候,我们可以用PCA降维,但是降维前通常我们要对数据进行标准化,为什么要这样做?这有什么好处?
Answer
PCA(主成分分析)所对应的数学理论是SVD(矩阵的奇异值分解)。而奇异值分解本身是完全不需要对矩阵中的元素做标准化或者去中心化的。
但是对于机器学习,我们通常会对矩阵(也就是数据)的每一列先进行标准化。
PCA通常是用于高维数据的降维,它可以将原来高维的数据投影到某个低维的空间上并使得其方差尽量大。如果数据其中某一特征(矩阵的某一列)的数值特别大,那么它在整个误差计算的比重上就很大,那么可以想象在投影到低维空间之后,为了使低秩分解逼近原数据,整个投影会去努力逼近最大的那一个特征,而忽略数值比较小的特征。因为在建模前我们并不知道每个特征的重要性,这很可能导致了大量的信息缺失。为了“公平”起见,防止过分捕捉某些数值大的特征,我们会对每个特征先进行标准化处理,使得它们的大小都在相同的范围内,然后再进行PCA。
此外,从计算的角度讲,PCA前对数据标准化还有另外一个好处。因为PCA通常是数值近似分解,而非求特征值、奇异值得到解析解,所以当我们使用梯度下降等算法进行PCA的时候,我们最好先要对数据进行标准化,这是有利于梯度下降法的收敛。
没做标准化的PCA是找covariance matrix的eigenvector,标准化后的PCA是找correlation matrix的eigenvector。如清风说的第一点,如果没有做标准化,eigenvector会偏向方差最大的变量,偏离理论上的最佳值。
举例说明。假设一个2维Gaussian,correlation matrix是[1 0.4;0.4 1], $std(x_1)=10, std(x_2)=1$。理论上最佳的分解向量是椭圆的长轴,如果没有做标准化,PCA算出的向量和长轴会有偏差。标准化后偏差会减到很小。
#standarization of PCA
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
np.set_printoptions(precision=3)
np.random.seed(0)
n=1000000
mu=[0,0]
corr=np.array([[1.,.4],[.4,1.]])
std_vector=[10.,1]
A_ori=np.random.multivariate_normal(mu,corr,n)
A_scaled=np.matmul(A_ori,np.diag(std_vector))
scaler = StandardScaler()
scaler.fit(A_scaled)
A_standarized=scaler.transform(A_scaled)
pca = PCA()
pca.fit(A_scaled)
pca1 = PCA()
pca1.fit(A_standarized)
print('Correlation Coefficient matrix is:')
print(corr)
print('std vector is:')
print(std_vector)
print('Covariance matrix is:')
print(np.cov(A_scaled.T))
print('---Before standarization---')
print('Components:')
print(pca.components_)
print('Sigular values:')
print(pca.explained_variance_)
print('---After standarization---')
print('Components:')
print(pca1.components_)
print('Sigular values:')
print(pca1.explained_variance_)
# draw PCA components
t1=np.linspace(-20,20,100)
t2=t1*std_vector[1]/std_vector[0]
plt.figure(figsize=[10,5])
plt.subplot(121)
plt.hist2d(A_scaled[:,0],A_scaled[:,1],100,alpha=0.7)
plt.plot(t1,t2,'--k')
c=pca.components_
r=np.sqrt(pca.explained_variance_)
plt.arrow(0,0,c[0,0]*r[0],c[0,1]*r[0],color='red',head_width=.3)
plt.arrow(0,0,c[1,0]*r[1],c[1,1]*r[1],color='blue',head_width=.3)
# plt.axis('equal')
plt.title('before standarized')
t1=np.linspace(-20,20,100)
cov=np.cov(A_standarized.T)
t2=t1*cov[1,1]
plt.subplot(122)
plt.hist2d(A_standarized[:,0],A_standarized[:,1],100,alpha=0.7)
plt.plot(t1,t2,'--k')
c=pca1.components_
r=np.sqrt(pca1.explained_variance_)
plt.arrow(0,0,c[0,0]*r[0],c[0,1]*r[0],color='red',head_width=.2)
plt.arrow(0,0,c[1,0]*r[1],c[1,1]*r[1],color='blue',head_width=.2)
# plt.axis('equal')
plt.title('after standarized')
plt.show()
PCA实现的方式其实有四种:
- 标准化数据后的协方差矩阵
- 标准化数据后的相关系数矩阵
- 未标准化数据后的相关系数矩阵
- 标准化数据后的svd方式
这四种方式是等价的。
不标准化的PCA就是TruncatedSVD,其实不标准化也行吧。
Question 1000433: hashing trick或者feature hashing是什么
统计/机器学习 数据预处理 数据降维我看到有人说可以用hashing trick来进行降维?这个hashing trick是什么意思?怎么降维?
好像feature hashing也是这个意思。
Answer
Hashing trick,有时候也叫做feature hashing,在自然语音中已经用作降维的手段。在一般的机器学习任务中,它也可以对categorical feature进行降维。
举个例子,比如你是淘宝的算法工程师,你要做一个退货的预测模型,假设有一个feature是location_id,表示商品的产地。这个是categorical feature,所以你通常需要做one-hot encoding,把这一列转化为dummy variable。商品来自全国各市、全球各国,可能这个location_id就有成千上万个数值。转码之后,模型就会增加这一万个dummy变量。这对数据的读取、操作,模型的训练都是极大的挑战。
Hashing trick就是用hashing function这个小技巧来降维。若location_id都是整数,我们可以对所有的location_id取余,location_id (mod p),这个取余函数就是我们使用的hashing function。很显然进行取余操作之后,我们最多只有p个不同的数值了。在此之上再用one-hot encoding,我们只增加了p列。
location_id location_id (mod 5)
21 1
9126 1
45 0
10 0
1189 4
Hashing trick有三个主要的优点
1.降维程度大
2.计算快速、方便
3. 不要额外的存储空间(额外的参考词典等)
但是,也有些缺点。比如我们观察到上面产地编号9126和21除以5的余数都是1,它们就被放到了一起。在Hashing trick中,这种冲突和合并是无法避免的。但是根据一些论文和大量业界应用的结果,这种冲突合并对预测模型的表现的影响微乎其微。另一个缺点,因为大量的数值并合并,这使得模型和结果不易interpret。
Question 1000459: 像年、月、日、小时这种时间变量一般怎么处理?
统计/机器学习 数据预处理 时间序列我在做一个预测模型,有一些时间特征,比如像月份和礼拜几,还有小时该怎么处理?
比方说,对于小时来说,0表示这个数据记录时间在0点到1点之间,20表示记录在20到21点之间。我是该用OneHotEncode把它转化为categorical变量呢,还是就把它当做正常的数值变量?用OneHotEncoder的话,我就损失了时间的连续性;用数值变量的话,明明23点和0点只差一个小时,但是在数值上却是相差最大的。
类似的,礼拜几,日期,分钟,都有这样的困扰出现。有什么好方法吗?
Answer
我们可以不用OneHotEncoding,可以用极坐标来表示周期的变量。
我就拿小时举例吧,其他的都可以以此类推。
因为时间变量都是有周期性的,所以可以联想到极坐标(想象一下钟表)。不过为了表达原本时间上的连续性以及头尾的相接性,我们需要把原来的数据从一维变成两维的。比如原来是$h$,现在就转化$(\cos\frac{2\pi h}{24}, \sin\frac{2\pi h}{24})$。
比如原来的小时变量的数据位
H
0
1
17
23
就被转化为两个变量
H_cos H_sin
1.000 0.000
0.966 0.259
-0.259 -0.966
0.966 -0.259
这样我们就保证了时间的连续性和头尾相接性。
如果是分钟,就转化为$(\cos\frac{2\pi m}{60}, \sin\frac{2\pi m}{60})$.
如果是月份,就转化为$(\cos\frac{2\pi Mon}{12}, \sin\frac{2\pi Mon}{12})$.
Question 1000506: NLP中的hashing trick是什么?
统计/机器学习 自然语言处理 数据预处理 数据降维NLP中经常用到hashing trick,和一般分类或者回归问题中使用的hashing trick是一回事吗?
Answer
本质上其实是一回事。也是通过合并来降维的。
语句1: "There is a dog. The dog is running."
语句2: "There is a cat. It is running, too."
1 there
2 is
3 a
4 dog
5 the
6 running
7 cat
8 it
9 too
语句1: "1 2 3 4 5 4 2 6"
语句2: "1 2 3 7 8 2 6 9"
如果用OneHotEncode的话,我们需要两个9维的向量存放这两句话。如果有其他m个语句,出现k个单词,那么我们就需要一个长度为k的向量来表示每个语句。这样的话,维数会特别大,数据也会特别sparse。
如果我们采用hashing trick,比如用mod 4作为hashing function,那么
1 there
2 is
3 a
0 dog
1 the
2 running
3 cat
0 it
1 too
语句1: "1 2 3 0 1 0 2 2"
语句2: "1 2 3 3 0 2 2 1"
不管是多大的词汇量,语句都可以被表示为一个四维向量
v1 = [2, 2, 3, 1]
v2 = [1, 2, 3, 2]
Question 1000585: 对进行回归分析之前,如何处理不同类型的变量?
统计/机器学习 回归分析 数据预处理我有4个变量:
变量1:是取值0到1之间的实数
变量2:是取值0到100000之间的数
变量3:是categorical variable,有6个不同的取值
变量4:也是categorical variable,有3个不同取值,但是它们之间是有排序关系,类似于“微弱”,“中等”,“强烈”
在回归之前我需要对这些变量做哪些处理呢?
Answer
Question 1000627: 如何判断缺失值是否是随机的缺失?
统计/机器学习 数据预处理我有一列数据,缺失值特别多,占到了70%左右。
我看了数据中的缺失值如何处理这个问题,发现有个答案里提到了要先判断这个缺失是否是随机的,那么怎么判断呢?
Answer
最直观的就是画图。
对于回归:
把整体的y的直方图画出来,再把这列当中缺失值位置对应的y的直方图画出来,看看它们是不是接近的。
对于分类:
把整体的y的每个一类的百分比算出来,再把这列当中缺失值位置所对应的y的每一类的百分比算出来,看看是不是接近。
Question 1000651: 进行K-Means聚类前,需要对数据做怎样的预处理?
统计/机器学习 无监督学习 数据预处理进行K-Means聚类前,需要对数据做怎样的预处理?不是非常明白,请多多指教!
Answer
对于数值变量,最重要的就是对原始数据标准化,使得每个变量的方差的大小相等。原因类似于我们PCA之前要先标准化。
对于分类变量,要做编码。
Question 1000817: 什么是SMOTE sampling方法?
统计/机器学习 抽样方法 数据预处理在其他文献中看到了SMOTE Sampling方法,它可以解决非平衡二元分类问题,有人具体了解这个抽样方法吗?可以介绍一下吗?
谢谢!
-----
Answer
SMOTE是一种对普通过采样(oversampling)的一个改良。普通的过采样会使得训练集中有很多重复的样本。
SMOTE的全称是Synthetic Minority Over-Sampling Technique,译为“人工少数类过采样法”。
SMOTE没有直接对少数类进行重采样,而是设计了算法来人工合成一些新的少数类的样本。
为了叙述方便,就假设阳性为少数类,阴性为多数类
合成新少数类的阳性样本的算法如下:
- 选定一个阳性样本$s$
- 找到$s$最近的$k$个样本,$k$可以取5,10之类。这$k$个样本可能有阳性的也有阴性的。
- 从这$k$个样本中随机挑选一个样本,记为$r$。
- 合成一个新的阳性样本$s'$,$s'=\lambda s + (1-\lambda)r$,$\lambda$是$(0,1)$之间的随机数。换句话说,新生成的点在$r$与$s$之间的连线上。
重复以上步骤,就可以生成很多阳性样本。
=======画了几张图,更新一下======
用图的形式说明一下SMOTE的步骤:
1.先选定一个阳性样本(假设阳性为少数类)
2.找出这个阳性样本的k近邻(假设k=5)。5个近邻已经被圈出。
3.随机从这k个近邻中选出一个样本(用绿色圈出来了)。
4.在阳性样本和被选出的这个近邻之间的连线上,随机找一点。这个点就是人工合成的新的阳性样本(绿色正号标出)。
有个疑问:在第二步 "找到$s$最近的$k$个样本,$k$可以取5,10之类。这$k$个样本可能有阳性的也有阴性的", 感觉这样选会导致label混乱,比如随机数接近1的情况下,label是阴性还是阳性?我找了下资料,基本上都是要找同样label的近邻样本,比如这个:http://rikunert.com/SMOTE_explained
Question 1000896: 数据预处理中,都有哪些方法能够处理缺失值(missing value)
统计/机器学习 数据预处理我自己除了直接删掉缺失值对应的行以为,常用的就是用该列的平均值代替,但是总感觉这样不是最好的办法。请问大家还有别的好办法吗?
Answer
题主也可以参考这个问题,应该是同样的问题。
从实际角度出发,首先要了解缺失的原因;其次,看缺失值和预测值的联合分布,看看其中有没有什么蹊跷。
从处理的角度来说,如题主说到的,
- 可以用均值,也可以用众数,中位数;
- 可以按类的均值(众数、中位数)补全,比如说数据中A列中的数值有缺失,B列是一个categorical variable,你可以按照B列中的类别,用类别的均值对A列中的数据补全。
我只是抛砖引玉。期待更好的回答!
Question 1000897: 如何对流数据(stream data)进行无差别抽样
统计/机器学习 抽样方法 无监督学习 数据预处理比如我有一个在线的列表,但是这个在不断的增加新的数据,我应该如何设计抽样方法才能使每个元素被抽到的概率一样呢
Answer
Question 1001099: 协同过滤的数据预处理问题
统计/机器学习 推荐系统 数据预处理我正在做一个协同过滤的项目,第一次做,想请教一下,从经验上,协同过滤的数据集需要哪些预处理?
Answer
雅虎的这篇论文讲了如何对音乐推荐系统做特征工程
这个不就是user item 评分 三列吗
除了做个scale想不出其他的了
同问,建模的时候用多大数据量
Question 1001170: gbdt如何对连续特征离散化
统计/机器学习 数据预处理 特征选择有时候对连续特征处理时,例如年龄,需要离散化,但是不知道怎样离散化比较合适,听说gbdt可以离散化,请问是怎样实现的?
Answer
我抛砖引玉一下。
对连续特征离散化是决策树本身就可以做到的,而不是非要gradient boost。
决策树是这样做的。
- 首先对这个连续变量排序。比如说年龄,把所有样本中年龄的数值从小到大排序。
- 在数据没有重复的假设下,如果有n个样本,那么排序后的数据之间应该有n-1个间隔。
- 决策树会对这n-1个间隔进行逐一尝试(分叉),每个不同的分叉,会带来不同的gini指数,我们最终选gini指数最小的那个分叉作为最优分叉。
理论上是这样进行的,但是实际情况是为了一些计算优化,可能会进行一些随机搜索,而不一定是遍历。
上面这个过程就把那个连续变量进行了一分为二(第一次离散化),比如说年龄被分成了0到20岁,20到100岁。
接下来,当决策树继续生长时,之前一分为二的连续特征可能会再次被选中。比如说20到100岁这个分叉被选中,我们再次重复上面那三个步骤。这次得到的结果可能是20到35,35到100岁。
以此反复,这样一个连续变量就不停地被离散化,直到模型达到停止的条件。
Question 1001239: laplace光滑什么意思
统计/机器学习 贝叶斯 自然语言处理 数据预处理自然语言处理里和贝叶斯模型里出现的laplace光滑什么意思?有什么用?
Answer
拉普拉斯光滑是用来对分类变量的出现频率进行光滑修正的一个手段。
比如有一句话“我学习机器学习”,一共七个字。
“我”出现了一次。频率为$$f(我)=\frac{1}{7}$$
“学”出现了两次。频率为$$f(学)=\frac{2}{7}$$
拉普拉斯光滑的公式为
$$g(x)=\frac{n_x+\alpha}{l+\alpha c}$$
其中$n_x$是单词$x$出现的次数,$l$是句子的长度,$c$是句子中不同词汇的个数,$\alpha$是拉普拉斯光滑的光滑系数,这个是自行设定的。
上面的句子里一共七个字,五个不同的字。假设我们选定$\alpha=1$:
$$g_1(我)=\frac{1+1}{7+1\times 5}=\frac{2}{12}=\frac{1}{6}$$
$$g_1(学)=\frac{2+1}{7+1\times 5}=\frac{3}{12}=\frac{1}{4}$$
假设我们选定$\alpha=2$:
$$g_2(我)=\frac{1+2}{7+2\times 5}=\frac{3}{17}$$
$$g_2(学)=\frac{2+2}{7+2\times 5}=\frac{4}{17}$$
$\alpha$越大,得到的结果越接近于均匀分布。
拉普拉斯光滑解决一些0概率问题,即一个样本虽然不出现,但是我们不能认为它的概率就一定是0。在贝叶斯模型中,拉普拉斯光滑很常见。
此外,拉普拉斯光滑不只是在自然语言处理的文本、词汇数据。它使用用所有的多元categorical的数据。
拉普拉斯光滑也有一些变种的方法,具体可以参考维基百科
Question 1001534: 分类变量,进行One hot编码,维度升高,如何处理?
统计/机器学习 数据预处理 数据降维如果一个分类变量有非常多的类,进行one hot编码后,维度会升得很高,该如何处理?
谢谢!
Answer
有几种思路可以尝试的:
1. 要看这个变量背后的逻辑了,就像雷猴说的,它的意义是什么,有没有办法按照这个分类变量本身的意义进行合并。
2. 按照目标值进行合并,比如你的目标是0-1二元预测,如果这个分类变量取A的时候,90%是1;取B的时候,89%是1。那么A和B就可以合并在一起。最后再做one hot。如果你的目标是回归,也是类似的方法。
3. 把分类变量的分类按频次高低排序,累计到90%或者95%的分类都保留,最小的10%或者5%可以合并成一类。
4. hashing trick,随机合并。
那要看你的分类变量是什么了,有没有办法进行一些合并。
比如你的分类变量是中国的村镇,那你可以合并到县或者市甚至省这一级别。
比如你的分类变量是产品,那你看看能不能分到什么大类里面。
总之就是进行合并处理。
此外,有些分类变量可能频次特别低,比如出现次数小于20次或者50次的那种,你把所有这种小频次的大不了也可以合并起来。
还有个思路是不对分类变量做one hot处理,而是用y的均值代替。
可以低维嵌入
用count来代替。比如类别A出现10次,就用10代替所有的A,B出现20次,用20代替B。这样就把分类的变量全部换成了整数。
如果是用户id item id这种特征的话,建议使用embedding,用一个模型先对这些特征的表达进行预训练,可以有效的降低维数,而且可以提高 training和serving时的效率。这个预训练用的模型虽然需要的数据量很大,但也不需要更新的很频繁,对算力的占用不算高。
如果是省市 id 这种特征的话,one-hot 之后有几十、几百维这样,可以在模型内部进行 embedding
还有一种方式就是选择更适用于高维稀疏数据的模型,如 LR FM 这种。
我一般用每个分类对应的目标变量的均值来代替
除了上面各位提到的方法,还有人说可以用每个分类出现的频数来代替,How to deal with Features having high cardinality。实际效果应该和feature hashing差不多吧。
Question 1001877: R里的merge函数是inner join还是outer join?
统计/机器学习 数据预处理 RR里的merge函数可以合并两个dataframe,它是inner join还是outer join?还是其他方式的join?
Answer
R的merge是inner join
Question 1001943: 如何处理聚类中的missing data
统计/机器学习 无监督学习 数据预处理我现在对一个数据作clustering,missing data特别多,missing data有分类,也有实数。
我现在处理的方法是:
1.填一个固定值,比如100,表示它是missing data
2.填所在变量的均值
3.用SVDmiss填值。
4.在两点算距离时,忽略出现nan的变量。比如x1=(1,2,3),x2=(2,nan,4),dist(x1,x2)=sqrt((1-2)^2+(3-4)^2)。
请问大家还有什么思路。
Answer
可以试试k POD
k POD类似于k Means,但是可以处理missing
方法大概是这个思路
1. 先只用完整的数据进行聚类
2. 然后根据聚类的结果,用一个聚类中的均值来代替这个聚类中的缺失值
3. 用填充好的数据,再聚类,然后根据新的聚类,重新再填充缺失值
4. 然后再聚类,反复进行
参考一下这个训练集中含有缺失值,一般怎么处理
一般不就是上来二话不说,删了。
要么对于离散的,可以用朗格朗日插值,就是插值法,或者中值众数中位数填充。还可以用模型对缺失值进行预测。
对于缺失值达到一半左右的,直接把缺失和不缺失做二分类。
Question 1001955: SMOTE对于categorical feature如何处理?
统计/机器学习 抽样方法 数据预处理Answer
SMOTE论文里第6章第1节讲的就是如何处理非连续的特征(categorical feature)。
论文里讲了三种方法,实际上就是两种思路:
思路1:先只考虑continuous feature,然后算出样本点和周围点的距离。如果样本点和周围点的categorical feature不同,那么就增加一个正则项,作为惩罚。原始距离加上惩罚项,就得到最后的近邻。
思路2:同样,只考虑continuous feature,然后算出近邻。categorical feature取这些近邻的众数。
categorical feature需要先量化吧,one-hot编码
Question 1002107: 训练集加入噪声防止over fitting还是加剧overfitting?
统计/机器学习 数据预处理 数据降维 特征选择如题,训练集中加入噪声,是有效防止了over fitting,还是加剧了overfitting?我看两种说法都有。
Answer
引入噪声通常是为了防止过拟合的,噪声一般能提高模型的泛化能力。
从另一个角度来看,训练集和测试集的区别往往就是一些噪声。
加噪声可以降低过拟合。可以想象高纬数据空间只有很少的training data,我们感兴趣的子空间就有太多漏洞,testing data出现在这些漏洞就会有很大的误差。两个思路去填充漏洞,一个是加很强的光滑函数(比如高斯),另一个是人工造data,比如加噪声后让training data小幅度震动,减少漏洞。
但是直接在数据上加噪声效果很难说,高级点的做法是在抽象的投影空间内加噪声,比如在主要特征(variational autoencoder)或模型参数(mcmc)上加噪声。
题主sjcd提到过拟合是因为模型学到了训练集中的噪声,并且基于噪声进行了预测
这话没错,但是这种情况下的过拟合可以通过交叉验证来防止。
在没有噪声的完美数据中,即使有交叉验证,也有可能发生过拟合。
Question 1002224: 怎样处理具有大标签的数据?以及标签数据缺失怎么处理?
统计/机器学习 数据预处理 特征选择最近在做lookalike的模型,数据中提供了用户爱好给了标签。比如{9876,3452,1243}都是很大的数,我想用独热编码{0,1,0,.....}去生成特征的话,是不是先要重新标签化,另外,标签数据缺失的话,是不是要用{1/n,1/n,1/n,......}来代替,新手求教,希望大佬有空解答一下,万分感谢!
Answer
希望题主能对该特征的数据给出更加详细的描述,比如每个样本此特征的取值可能是多个标签还是也就一个标签?按我的理解应该是多个标签? 然后大概分析一下每个标签的出现的频次,我们是否能选择topN个比较有效的标签从而忽略其他标签?然后做个LabelEncoder(),然后再做个onehot?关于数据缺失,是数据全部取0还是取1/n,这点我也不是很清楚,这仅仅是我的一点思考,我也是一个新手,希望大神批评指正。
ps 题主是在做腾讯的算法赛?
不一定非要独热编码,可以参考下这个分类变量,进行One hot编码,维度升高,如何处理?
可以试试搞一波feature hashing
Question 1002263: 离群点、孤立点、异常点有什么区别吗?
统计/机器学习 无监督学习 数据预处理平时提到的离群点、孤立点、异常点有什么区别吗?是一回事吗?
Answer
离群点(outlier)和异常点(anomaly)其实都混着用的,我感觉大同小异。如果真要纠结离群点和异常点的区别的话,我可以说说我的理解。
离群点一般是指远离其他点的,比如距离均值超过3个标准差。比如说,全班考试平均分20,标准差是10,你考了100分,你就离群了。从假设检验的角度来说,给定了一个总体的分布,p值很小很小的点就是离群的。
异常点比离群点更广泛些。除了离群,有差错的点也算是异常。比如说,全班考试平均分20,标准差是10,你考了100分,你就异常(离群)了。如果你考了-5分,尽管在3个标准差之内,但是负数明显是异常的。如果你考了31.415926分,也异常了,因为分数一般是整数或者0.5。
异常点还可以针对分类变量,比如有个变量是城市名称,上海、北京、深圳,如果这里还出现了“广东”,这就不对了,因为广东并不是城市的名字。
基本上就是同义词,Outlier Analysis这本书开头就写了
Outliers(离群点、孤立点) are also referred to as abnormalities, discordants, deviants, or anomalies(异常点) in the data mining and statistics literature.
感觉没必要深究。
我觉得就是可以理解为一个意思吧,不然有点咬文嚼字了
Question 1002624: dummy variable是n个还是n-1个
统计/机器学习 数据预处理对categorical的变量做dummy variable,也就是one hot encoding,比如这个变量有n个category,那么最后encode得到的是n个binary variable还是n-1个呢?从模型表现上说,两者有差异吗?
Answer
应该是n-1个。如果是n个的话,就会有一个dummy variable是冗余的,因为它可以被其他n-1个表示出来。
对于线性模型来说,冗余的dummy variable会增加变量的多重共线性。
如果是用random forests,并且非常在乎feature importance的话,可能用n个dummy variable比较好,不然的话就缺少一个variable的importance。
毕竟多重共线性对random forests影响不大
“对categorical的变量做dummy variable,也就是one hot encoding”。
------
这句话其实不大准确,one hot encoding和做dummy variable不大等价。它们的区别其实也就是你提的问题。
如果一个分类变量有n类,那么做dummy variable的话,你得到的是n-1个二元变量;如果做one hot的话,你得到的是n个二元变量。
one hot encoding会有冗余的变量。
Question 1003079: EDA步骤中,用全部数据还是只用训练集?
统计/机器学习 数据预处理 描述性统计在开始做EDA的时候,是用全部数据,还是在训练和测试集划分之后,只在训练集上做EDA?
Answer
要看EDA的目的了,如果EDA的目的只是看看数据的基本情况,画画图,那么用整个数据集问题做EDA问题不大。
如果EDA的目的是发现有用的变量或者根据变量和y的关系做一些变形,那么用整个数据集做EDA就会有“数据泄露”的风险。这样做出来的模型可能在验证集上会比实际测试集上好一些。
Question 1003208: z-score标准化不适用于处理什么样的数据?
统计/机器学习 数据预处理换句话说,用z-score标准化处理数据时,对原始数据的分布是否有什么要求?
Answer
没有什么太严格的要求,但是最好是要接近对称的分布,不要太skew就好了
Question 1003274: 在训练前数据处理的时候,怎么剔除异常值?
统计/机器学习 数据预处理在训练前数据处理的时候,怎么剔除异常值?
有哪些常用的手段?
Answer
- 删除含有异常值的记录:直接将含有异常值的记录删除;
- 视为缺失值:将异常值视为缺失值,利用缺失值处理的方法进行处理;
- 平均值修正:可用前后两个观测值的平均值修正该异常值;
- 不处理:直接在具有异常值的数据集上进行数据挖掘;
@libinx 主要说了怎么处理异常值
我说下怎么发现异常值,一般要么是根据逻辑、常识,要么是根据实际数据分布
比如年龄作为特征一般在0到120之间,如果超过这个范围了肯定是异常了
根据数据分布的话通常是用IQR来判断,如果一个数和均值的差超过1.5倍的IQR了,就算是异常
Question 1003285: 什么时候需要对y或者特征进行对数变换?
统计/机器学习 数据预处理对数变化是比较常用的变换的方法,但是不是太清楚什么时候需要对y或者特征进行对数变换?
Answer
当y看起来像偏态分布(skewed distribution)的时候,我们可以对y取log
对特征也同理
但是对log的时候要保证数值都是正的
Question 1003489: 时间序列样本中有负数时怎么求几何平均值?
统计/机器学习 数据预处理 时间序列时间序列波动性比较大的时候,我们可以用移动几何平均,但是样本中有负数时该怎么解决,如何求几何平均值?
Answer
如果有负数就不大适合用几何平均了,建议用其他方法
一个例子是,$a=-1$,$b=-4$,那么它们的几何平均数是2,两个负数的“平均值”反而是正数,难道不奇怪吗;如果$a=1$,$b=4$,它们的几何平均也是2,这难以解释。所以有负数时,最好别用几何平均。
Question 1003558: 标准化训练数据后,测试与线上部署的数据如何进行标准化?
统计/机器学习 数据预处理 TensorFlow本人初学一段时间,因为模型只包含一层输入层和LSTM,所以采用了
min_max_scaler = preprocessing.MinMaxScaler()
data_array = min_max_scaler.fit_transform(data_array)
这样的预先归一化的方法,训练数据的最大最小范围在8000~10000,训练完毕后该如何对测试和真实预测数据进行归一化呢,两个疑惑:
1.测试与预测数据范围与训练数据不同,出现了6000或者更低更高的情况,这种情况下sklearn的函数训练MAX,MIN与真实情况不一样,该如何处理?
2.训练数据batch较大为128,预测数据只有1size,这种在代码上如何处理?
另外,能否给出完整的代码区分训练,测试,预测呢,BN的处理也行,非常感谢,使用的是tensorflow
Answer
我觉得你不能分别对train和test做标准化,不然就会有问题。你应该对train做标准化,然后用标准化的结果作用在test上。
比如
# 对整个训练集标准化
min_max_scaler = preprocessing.MinMaxScaler()
train_scaled = min_max_scaler.fit_transform(train)
# 利用上面的min_max_scaler对某一个测试样本进行标准化
test_sample_scaled = min_max_scaler.transform(test_sample)
至于第二个问题,本来predict的时候就是一个个进行预测的,没有所谓的batch吧
Question 1003773: auto-encoder异常检测的问题,无标签情况下怎么进行预测?
统计/机器学习 无监督学习 深度学习 数据预处理看到最新的一期auto encoder用于信用卡欺诈检测,进行重建误差的时候,已明确具体的正负样本,即数据是存在label标签的,这样子绘制reconstruction的mse、mae确实很清楚的看到欺诈样本的误差较大。但在数据集没有label的情况下怎么进行预测测试集中的欺诈样本呢,或者说怎么设定reconstruction MSE/MAE的threshold呢,通过threshold来确定?
Answer
这里有两个步骤:
1. 先unsupervised learning,训练一个autoencoder得到MSE score。MSE=autoencoder(x)。loss中只有input$x$,并没有label$y$。
2.再根据MSE得到一个binary classifier,目的是确定一个threshold让总体error最小。比如下图中横轴是MSE。最终目的是让typeI和type II error的加权和最小。
$argmin_c [w_0 \int p(MSE>c|y=0) + w_1 \int p(MSE>c|y=1)]$如果对positive/negative平均看待,$w_1=P(y=1),w_0=P(y=0)$。也可以另外建模。
如果已知$y$,可以估计$p(MSE|y=1)$和$p(MSE|y=0)$。否则只能假设这两个分布。粗糙一点,也可以人为设定$c$,比如$P(MSE>c)=0.001$。
-----------------------------------------------------------------
第一步应用autoencoder中,有个假设是negative 和positive的pattern不同:在某个基(basis)坐标系中positive是远离negative的clusters。只要找到一个basis,能很好表达negative,并且很大概率不能很好表达positive,这样就能在这个basis上区分positive/negative。
autoencoder学习的是数据的nonlinear sparse representation,中间层的Z code就是一个m维的非线性basis。假设要表达所有positive/negative需要n维,[z1,z2,...zn],而表达negative只需要m维,m
举个例子,一只猪混到一群猴子中,而且对它们只进行爬树的考试。最后根据爬树的结果,很容易就把猪找出来了。而autoencoder学习的是如何在[吃饭,跑步,爬树,跳高,...]等考试中把爬树找出来。
好像的确挺不好办的,很多时候非监督学习也是有ground truth的。但是如果完全不知道真实情况的非监督异常检验,那就只能凭直觉或者应用场景了。
比如你知道0.1%的信用卡有异常,那么你的threshold就可以选择重建误差最大的0.05%或者0.1%,基于你是想保守点还是冒险点了。
Question 1003796: 学习auto-encoder, 自己写的demo, 关于拟合的问题,帮忙看下loss-acc图?
统计/机器学习 无监督学习 深度学习 数据预处理数据大约3w左右,8:2 split train和test, model是auto-encoder, loss是MSE, 根据train\test 的acc最终的值还是比较满意的。
1、但是model loss这块,train和test的收敛觉得还可以,但是出现val_loss比loss大的情况,尤其是图一的val_loss, 是否问题?
2、关于datasize对acc的影响,自己尝试过程中,数据量在1w多情况下,model loss情况和上面比较类似,但acc只能达到0.5, 0.6左右。是否可以说明数据量的影响还是比较大的?
3、关于数据预处理,除了特征提取和标准化外,自己在这块没怎么做。一是数据基本无缺失值,二是特殊值很大程度上就是我要找的异常点,是否有必要做聚类分析?
谢谢
Answer
第一个问题:
你split train和test的时候是随机的吗?感觉这个loss相比于第二行的图有点大,感觉可能是有问题。
第二个问题:
对于神经网络模型,数据量大当然是很重要的,毕竟有那么多参数需要估计
第三个问题:
可以试试用autocoder中间的code来做做聚类试试
你第一个图里的test应该是有很多异常数据的,所以test上的mse和train的差很远,而且波动性也大(没有蓝色光滑,也没有第三幅图的橙色线光滑)。异常多,也更容易挑出来,所以acc高也正常。
数据量肯定是越多越好的,第一幅和第三幅的蓝色曲线的取值范围也不同,第一个似乎到了0.25,而第三个图好像还在0.3以上。也就是说数据多的时候拟合的更好。
Question 1003962: 怎么对特征做标准化使得数值都是正数?
统计/机器学习 数据预处理平常我们对数值特征做标准化都是:(数值 - 均值)/标准差
这样标准化处理后的特征有正值也会有负值。
有没有一种标准化的方法能够让处理后的数值都是正数,或者非负数?
Answer
题主可以看下在数据预处理阶段,特征的标准化有哪些方法?
“最大最小值标准化”可以在训练集上保证处理后的数值为非负。
“范数标准化”可以在训练集上保证处理后的数值为[-1, 1],再加1,就可以保证非负。
当然还有非线性的标准化,比如百分位标准化,最后得到是[0, 100]范围的数。
不过这几个方法都不能确保在测试集上的处理结果也是非负的。如果你的模型或者方程必须要输入值为非负的,那么你需要在测试集上多做一点处理,比如说所有负数都取0等等。
min-max scaling
归一化:(当前值-最小值)/(最大值-最小值)
Question 1003987: 关于autoencoder做无监督学习的验证问题
统计/机器学习 无监督学习 数据预处理 模型验证1、keras训练的autoencoder模型,损失基于mse,数据量选了约10w。之前发过帖子,这是经优化过的model,之前的问题是:loss和val_loss收敛的不好且震荡,val_acc比较震荡,自己按如下方式试过:
修改autoencoder神经网络结构;
降低batch-size, val_loss的学习率;
加了L1正则;
最主要的:怀疑数据集样本分布不均,进行聚类然后用过几个算法筛选训练数据;
2、结果:如现在,loss和val_loss大致在0.08左右,还是会有轻微震荡,acc和val_acc在0.95左右,但也不是太平滑,考虑已经处理过数据集,怀疑还是验证集存在问题,由于自己缺乏调参和分析经验,求大神指点!
Answer
可以描述下应用吗?比如是regression/ segmentation/ classification,输入输出是什么,具体loss funtion。我印象是以accuracy作指标的应该用entropy类loss,比如softmax entropy。
如果你问题是想让loss和accuracy线更平滑,可以试试加大batch size,加大regularization,作data augmentation,加大优化算法的momentum,减小learning rate,用batch normalization,shuffle训练数据。
Question 1004095: 为何模型行前先要检验分布情况?
统计/机器学习 假设检验 概率分布 数据预处理 损失函数各位高手,我一直很困惑,很多人在将数据放进机器学习模型之前,要先看数据特征的分布情况,比如T分布(T检验)、卡方分布(卡方检验)、正态分布等,为什么呢?还有很多情况下,都要确保独立同分布,啥模型会对同分布要求这么高?莫非很多模型的cost function都是基于正态分布推导来的吗?
Answer
模型行前先要检验分布是EDA中的重要步骤。要建模前肯定是要看特征和目标变量的分布。
特征的分布往往决定对特征要不要做变换、做哪种变换。
至于目标变量的分布也是类似的,看要不要做变换,如果是用glm的话,要根据分布选择合适的link function等等。
题主提到了残差,那如果残差不是正态分布呢?如果异常点很多呢?
这个情况下要不然考虑换loss function,比如MAE作为loss,或者分位数回归,huber回归(参考下鲁棒性的回归模型)。要不然就是在loss function里加权重,比如加权最小二乘法之类的。
对于二分类模型的话,了解y的分布,也可以帮助你看是用log-loss还是加权的log-loss,或者进行欠采样等等。
Question 1004516: 怎么理解nlp里的good-turing smooth?
统计/机器学习 自然语言处理 数据预处理怎么理解nlp的good-turing smooth?谢谢~
Answer
下面这个ppt里讲的也挺清楚的,从第52页开始,ppt的链接
Question 1004543: 高斯模糊具体是什么?
统计/机器学习 数据预处理 计算机视觉请问高斯模糊是怎么对图像进行模糊的?
Answer
高斯模糊是模糊的一种。最简单的模糊就是对一个点周围的点求均值。
稍微复杂一点就加权平均。如何加权呢?可以利用高斯分布产生权值。
高斯模糊就是图像和一个高斯矩阵做卷积。
Question 1004554: 如何检测判断特征的多重共线性?
统计/机器学习 数据预处理 特征选择如何检测判断特征的多重共线性?
Answer
1. 特征之间两两求皮尔逊相关系数
2. 求方差膨胀因子(VIF),VIF越大,共线性越大。相似的指标还要容忍度。
可以看数据集矩阵是不是满秩的,如果不是满秩,那么一定有多重共线性
Question 1005462: 特征归一化后的多项式回归拟合结果
统计/机器学习 回归分析 数据预处理#%%
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
ITEMS = 4
path = 'train.txt'
data = pd.read_csv(path, sep='\t\t', header=None, names=['Population', 'Profit'],)
base = data.iloc[:, 0:-1].values
for i in range(ITEMS-1):
data.insert(0, '{}Square'.format(i+2), base ** (i+2))
X = data.iloc[:, 0:-1]
sample_mean = X.mean().values
sample_std = X.std().values
X = (X - X.mean()) / X.std()
X.insert(X.shape[1] - 1, 'Ones', 1)
y = data.iloc[:, -1]
X = np.matrix(X.values)
y = np.matrix(y.values).T
theta = np.matrix(np.zeros(ITEMS + 1))
#%%
def computeCost(X, y, theta):
inner = np.power(X * theta.T - y, 2)
return np.sum(inner) / (2 * len(X))
#%%
def gradientDescent(X, y, theta, alpha, epoch):
N = X.shape[0]
cost = np.zeros(epoch)
for i in range(epoch):
theta = theta - (alpha / N) * (X * theta.T - y).T * X
cost[i] = computeCost(X, y, theta)
return theta, cost
#%%
#迭代次数增加到一万后和矩阵法的结果一致
alpha = 0.01
epoch = 1000
solution, cost = gradientDescent(X, y, theta, alpha, epoch)
x = np.linspace(data.Population.min(), data.Population.max(), 100)
x_extend = (np.array(x, ndmin=2) - sample_mean[-1]) / sample_std[-1]
for i in range(ITEMS-1):
x_extend = np.insert(x_extend, 0, values = (x ** (i+2)-sample_mean[-i-2]) / sample_std[-i-2], axis=0)
x_extend = np.insert(x_extend, ITEMS, values = 1, axis = 0)
pred = np.matrix(x_extend.T) * solution.T
fig, ax = plt.subplots(figsize=(6, 4))
ax.plot(x, pred, 'r', label='Prediction')
ax.scatter(data.Population, data.Profit, label='Training Data')
ax.legend(loc=2)
ax.set_xlabel('Population')
ax.set_ylabel('Profit')
ax.set_title('Predicted Profit vs Population Size')
plt.show()
#%%
#梯度下降过程
fig, ax = plt.subplots()
ax.plot(np.arange(epoch), cost, 'r')
plt.show()
代码如上,梯度下降很快就收敛了,但是最后拟合出来的曲线和理想情况相去甚远,一直是单调递增的,不管是四次还是十次拟合,都是一个形状,请问大家这是为什么呢?
Answer
图像看起来是一波三折的,但是未必就是多项式能够拟合的吧,毕竟多项式也不能拟合任意函数。
这种形状不如试试分段的线性回归。
你这只是一阶的线性回归。要用到$x^2$,$x^3$,$x_ix_j$这类高阶输入的线性回归才是多项式回归。
Question 1005671: 关于LR过拟合的数据集问题
统计/机器学习 回归分析 数据预处理比如训练集中有两列特征X1和X2,现在分别对每一列特征乘以1000,构造数据集A,再对原始的每一列特征除以1000 构造数据集B,
问:在这两个训练集下训练的LR模型,哪个具有过拟合的风险?为什么?
Answer
如果原来的特征X1和X2不存在共线性,那么数据集A里这两个放大的特征,也不会存在共线性的问题,所以没有过拟合的情况。
数据集B和上面的情况类似,数据集也只有2个特征,所以不大会过拟合。即使它们会过拟合,也和乘除无关吧。
Question 1005714: 对图像进行数据增广有哪些方法?
统计/机器学习 数据预处理 计算机视觉对图像进行数据增广有哪些方法?
Answer
数据量不够的时候,我们就对图片进行一些变形来扩大训练样本的数量。图像的数据增广包括剪切、横向拉伸、纵向拉伸、缩放、旋转、翻转。下图就是一个例子
Question 1005782: 如何处理片段式停车数据
统计/机器学习 数据预处理 时间序列 数据可视化 应用场景我现在有停车场的停车数据,大体的数据如下:
df <- data.frame("carpark_No" = c("A1", "A2", "B3", "C9", "A1", "B3"),
"entry_date" = c("1/6/2019", "1/6/2019", "1/6/2019", "1/6/2019", "1/6/2019", "1/6/2019"),
"entry_time" = c("8:30am", "9:00am", "10:35am", "9:33am", "7:50pm", "8:01am"),
"exit_date" = c("2/6/2019", "1/6/2019", "3/6/2019", "1/6/2019", "2/6/2019", "1/6/2019"),
"exit_time" = c("5:30pm", "9:00pm", "4:35am", "6:00pm", "9:00am", "1:00pm"))
注释:
carpark_No: 停车场号码,区分不同的停车场
entry_date: 每辆车进入停车场的日期
entry_time: 每辆车进入停车场的时间
exit_date: 每辆车出停车场的日期
exit_time: 每辆车出停车场的时间
总的数据非常多,每一行代表一辆车进出停车场,目前我想先从停车位的占有率来入手,占有率 = 真实占有车位/总车位数, 对于真实占有车位的话,只能按时间段来算(对“点时间”和“进入时间”和“出去时间”进行对比),但是我现在有的数据是5年的,所以非常多,把时间段定的太小不太现实,希望大神能指点下,如何进行分析,除了占有率以外,其他的应用也可以,希望大家给出意见,非常感谢!
Answer
这个数据集感觉挺有意思的。占用率可以从两个方向看:
1)每个停车场每年的占用率,每个停车场可以得到5个数据点
2)每个停车场每个小时的占用率,然后每个停车场可以得到24个数据点
除了占用率,还有进入停车场时间点,和出停车场时间点。可以做个直方图,横坐标是24个小时,从0到23,纵坐标是比重。
还有,你可以做平均停车时长的计算,就是两个时间相减,同样也可以做直方图。
我觉得你可以用采样的方法来估计占有率。
比如你想估计停车场A1在2019年1月5日上午9点到10点的占用率,你可以采样3个时间点
t1 = 2019-01-05 09:15am, t2 = 2019-01-05 09:30am, t3 = 2019-01-05 09:45am
然后你再计算entry_date_entry_time <= t1 <= exit_date_exit_time的行数,这个行数就是t1时刻在A1停车场内的车辆的数量。同理,你也可以计算t2,t3时刻的占用率。
t1,t2,t3三个点的均值可以作为整个9点到10点时间段的估计值。
这样计算量会小很多。
这个问题和你的挺类似的,参考一下吧
Question 1005924: BatchNorm层能够防止神经网络过拟合嘛?
统计/机器学习 深度学习 数据预处理 计算机视觉 人工神经网络我理解的BatchNorm层是能够加速训练速度,那它还能够防止神经网络过拟合嘛?怎么解释呢
Answer
BN的初衷不是为了防止梯度消失或者防止过拟合。
BN是通过对系统参数搜索空间进行约束来增加系统鲁棒性,压缩搜索空间,改善系统的结构合理性,这会带来一系列的性能改善,比如加速收敛,保证梯度,缓解过拟合等。
具体对于过拟合来说,在BN中, Batch是随机选取进行Normalization, 并计算均值等, 在测试阶段, 应用均值这些训练参数来进行整体Normalization, 本质上是减小训练阶段的随机性。 因此, BatchNormalization也提供了Regularization的作用, 实际应用中证明, NB在防止过拟合方面确实也有相当好的表现。
论文原文是这么说的:
When training with Batch Normalization, a training example is seen in conjunction with other examples in the mini-batch, and the training network no longer producing deterministic values for a given training example. In our experiments, we found this effect to be advantageous to the generalization of the network. Whereas Dropout (Srivastava et al., 2014) is typically used to reduce over-fitting, in a batch-normalized network we found that it can be either removed or reduced in strength.
Question 1007363: 二值化和Onehot表示的特征哪一个较好?
统计/机器学习 数据预处理比如說有一個binary的特征表示性別,可以将其二值化成0及1,或one hot为向量[0, 1]及[1, 0],分別表示成男及女。 哪一个较好或更常用?
Answer
肯定是直接将男女表示为0或1更好啊
因为性别本身就是binary的,所以没必要进行one-hot。one-hot之后的数据是有冗余的,因为你可以根据[0,1]推出[1,0]。
Question 1007416: 如果数据不是正态分布,能用3sigma原则剔除异常值吗?
统计/机器学习 概率分布 无监督学习 数据预处理如果数据不是正态分布,能用3sigma原则剔除异常值吗?
Answer
如果不是正态分布,3$\sigma$原则不一定适用,但是如果是近似正态分布,应该问题不大。
如果不知道数据分布,可以用中位数+3IQR的方法。也可以用box-cox把数据转成近似正态分布,然后再用3$\sigma$的方法。
具体分析。3sigma的原理是正态分布时,3sigma能覆盖超过99%的数据。对于别的分布,3sigma的覆盖率会变化。比如log-normal这类的长尾分布,3sigma方法会把太多数据分类为异常。
你可以做实验,比如对N个数据算3sigma,再看异常个数是否能接受。
如果数据不是正态分布,直接用3sigma,后果可能是你删除了太多数据,也可能你什么数据都删不掉。
我觉得最重要的是要结合业务逻辑,如果符合业务逻辑,即使是超出这个范围的数值也不一定非要剔除。
Question 1007447: 机器学习中的维度灾难怎么防止和克服?
统计/机器学习 数据预处理机器学习中的维度灾难怎么防止和克服?
Answer
如果n是样本数量,p是数据的维度,当p非常大,或者p远大于n的时候,数据建模问题会变得非常棘手,这个现象就叫做维度灾难(curse of dimensionality)。
总之我们就是要防止p太大了。p在两种情况下会太大:
(1)本来p就很大;(2)经过预处理后p变得很大。
对于(1),我们要使用降维的方法来减小p,常见的方法可以参考除了PCA,还有什么降维的方法?
对于(2),我们要对预处理的过程小心谨慎,尽量不要创造出太多冗余的、无用的特征出来,比较容易出问题的是当我们对一个level很多的categorical feature做one-hot处理时,会有很多的稀疏特征产生,这时候容易造成维度灾难,所以要注意取舍和降维。
Question 1007619: 怎么非图像类的数据集做数据增广?
统计/机器学习 数据预处理 人工神经网络图像类的数据我们可以旋转、拉伸、翻转等等方法来做数据增广,增加数据数量。非图像类的数据集怎么做数据增广呢?
Answer
nlp的数据增广包括同义词替换, 随机差入单词, 随机删减单词, 以及word embeddings。
SMOTE应该算是一种吧
Question 1007623: 如果已知数据的四分位数和中位数,我能不能用matplotlib直接绘制箱形图?
统计/机器学习 数据预处理 描述性统计 数据可视化箱形图是由四分位数和中位数决定的,如果这些数据已知,能不能直接在matplotlib把箱形图绘制出来?
现在matplotlib里的boxplot是需要输入整个原始数据的,而不能直接用四分位数和中位数。
Answer
直接用plt.boxplot是不行的,可以用Axes.bxp
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
boxes = [
{
'label':'Male height',
'whislo': 162.6, #底部横线位置
'q1': 170.2, #第一四分位数
'med': 175.7, #中位数
'q3': 180.4, #第三四分位数
'whishi': 186.8, #顶部横线位置
'fliers': [160, 205] #outlier异常点的数值
},
{
'label':'Female height',
'whislo': 156.6, #底部横线位置
'q1': 160.2, #第一四分位数
'med': 163.7, #中位数
'q3': 166.4, #第三四分位数
'whishi': 171.8, #顶部横线位置
'fliers': [150, 151, 185] #outlier异常点的数值
}
]
ax.bxp(boxes,showfliers=True)
ax.set_ylabel('cm')
plt.show()
Question 1007630: 机器学习中的过采样和欠采样是什么意思?
统计/机器学习 数据预处理机器学习中的过采样和欠采样是什么意思?
Answer
我理解是不同数据有不同定义,可分为空间/非空间数据。空间数据指空间上邻近的数据含有相关信息,可以用信号处理滤波的方法提取出这些相关信号,比如图像,声音。非空间数据指数据不是空间上的邻居,不能提取空间信息,比如身高,姓名,工作,收入等不相关信号。
对于空间信号,欠采样和过采样就是信号处理中的under-sample和over-sample。其中心思想是根据采样定理,数字信号能保存的最大频率是其采样频率的1/2。
- 欠采样是采样频率小于信号最大频率的2倍,会有频谱的叠加,产生混叠。
- 过采样是采样频率远大于信号最大频率的2倍,会增加计算量,在数字换模拟信号时,还会增加模拟噪声。
对于非空间信号,欠采样和过采样是对数据的down/sub-sample和up-sample,参考这里。其目的是调整数据量,或者做分类平衡(class balance)。
- 欠采样:只想用少量数据代表大量的原始数据。 比如k-means里用mean代表一簇数据。Random forest也可以认为是对数据点和特征做down-sample。
- 过采样:生成新数据或重复采样。比如SMOTE,bootstrap。
过采样和欠采样是处理非平衡分类问题时的常用手段。
拿二元分类为例,如果训练集中阳性样本有1000个,阴性样本有10万个,两者比例为1:100严重失衡。为了一些模型的性能考虑,我们需要进行一些处理使得两者的比例尽可能接近。
过采样:对少的一类进行重复选择,比如我们对1000个阳性样本进行有放回的抽样,抽5万次(当然其中有很多重复的样本),现在两类的比例就变成了1:2,比较平衡。
欠采样:对多的一类进行少量随机选择,比如我们对10万个阴性样本进行随机选择,抽中2000个(当然原样本中很多样本未被选中),现在两类的比例就变成了1:2,比较平衡。
Question 1021568: 特征是否也需要Box Cox变换?
统计/机器学习 概率分布 回归分析 数据预处理Box Cox一般用于改善因变量的分布,使残差满足独立性和正态性,提高线性模型的性能。
但是我在kaggle的notebook中,看到一些大神也会对偏态分布的特征进行box cox变换,但我想不明白其中的意义。
看相关文章,大多都是围绕对因变量做变换,没有涉及对特征的box-cox变换的讲解。我调试了一下,发现对特征进行变换,性能甚至略微下降。
所以非常好奇这一点,是否有必要对偏态特征也进行box cox变换?如果是,其中的原理是什么?
希望各位大神们赐教,感激不尽!!!
Answer
对特征进行变换,也就是所谓的特征工程,是比较复杂的,没有一统天下的理论,都是根据实战得到的。
对于决策树,随机森林,boosting,这类跟树相关的模型,对特征做box cox,对最后的结果基本不会有影响。
对于线性模型来说,我们需要满足特征与目标成线性关系的假设。有时候只调整y的分布,未必能够满足所有的特征,所以有时候也对x进行调整。
还有一种情况是在做pca降维的时候,可以先对特征做一次预处理,把特征转成类似正态,对pca的稳定性也是有帮助的。
Question 1021742: 数据白化是什么意思?
统计/机器学习 数据预处理数据处理阶段中“数据白化”是什么意思?
Answer
数据白化(whitening)是把一组随机变量转化成协方差为单位阵的一组随机变量的过程。
协方差矩阵是单位阵表面随机变量之间相关性为0,并且每一个随机变量的方差都是1。经过这个操作之后每一个随机变量都像是白噪音。所以这个操作叫做白化。
常见的白化方法有ZCA白化和PCA白化。
Question 1021943: text CNN的输入训练样本有什么要求?
统计/机器学习 深度学习 自然语言处理 数据预处理 人工神经网络text CNN的输入训练样本有什么要求?必须要把文字转成词向量吗?
Answer
textCNN的输入是词向量,你可以直接用one-hot的结果。但是必将理想的方式是用word2vec训练出来的结果作为词向量输入捯模型当中。
Question 1022273: 因变量不是正态分布后取了对数之后还是不正态分布该怎么办?
统计/机器学习 概率分布 数据预处理因变量不是正态分布后取了对数之后还是不正态分布该怎么办?
求助各位!感谢!
Answer
你提到了因变量,我猜测你可能是要做回归模型,对y做处理的方式比较多,开n次方是一种,取log是一种,也可以用box-cox。此外也要看为什么需要正态分布,是不是可以从其他角度来思考。
下面两个链接供你参考box cox
Question 1022455: 类别型变量如何分箱
统计/机器学习 数据预处理 特征选择类别型变量如何分箱,比如省份;
Answer
类别型变量为什么要分箱?不都分好了吗?我猜你说的是划分成更大的类?
如果拿省份来举例子,那可以按照中国地理区域划分(华北、东北、华东、华中、华南、西南、西北、港澳台地区) 来进行分类
Question 1656025: 机器学习中文数据的训练集的预处理
统计/机器学习 自然语言处理 数据预处理类似于图上这样的样本,只有三个特征,还全是中文这种,看了很多资料是要把中文转成数组特征然后进行训练,现在不知道该用啥方式,有没有大佬给俺资料参考参考(才接触机器学习,被赶鸭子上架)
Answer
首先你要清楚做这个数据的目标是什么,然后再想下一步要做什么。
不管怎么说你这个是非结构化的数据,可以做一些结构化的工作的。
- 比如name那列可以做分词,或者人工做一些分类匹配,至少可以提取出“类别”:鲍鱼、黄鱼、龙虾什么的。
- standard那里基本上也可以看出单个品种的大小,只要类别做好了,standard这里是可以做比较的,可以改名叫平均重量之类的
- unit就是整个商品的总重量,你需要尽量转化到一个单位量纲上,要么都是g要么都是kg,有的是斤有的公斤有的克,也不可比。
主要还是要看建模的目标是什么,如果只是为了类别的聚类,用name这一列就够了,具体再看是NER还是做其他的方法。
如果要预测欢迎度什么的,可能又有不一样的玩法。
来自sofasofa(一个专业的机器学习社区),建议去sofa社区阅读,这里只是记录。防止网站在网络中走失。