1. 数据预处理
1. log(1+x)处理右偏分布数据
- log transformation 处理label的right-skewed右偏分布数据,使得一些很大值偏向中心,接近正态分布。但自变量是否需要log处理需要看情况…。参考链接
ln
Y
i
=
β
1
+
β
2
ln
X
i
+
ϵ
i
\ln{Y_i} = \beta_1 + \beta_2 \ln{X_i} + \epsilon_i
lnYi=β1+β2lnXi+ϵi - 得到的label也可以进行归一化处理。
class MyStandardScaler(object):
def __init__(self, identity=False, epsilon=1e-8):
self.identity = identity
self.mean_ = 0.
self.scale_ = 1.
self.epsilon = epsilon
def fit(self, X):
if not self.identity:
self.mean_ = np.mean(X, axis=0)
self.scale_ = np.std(X, axis=0)
else:
self.epsilon = 0.
def fit_transform(self, X):
self.fit(X)
return self.transform(X)
def transform(self, X):
return (X - self.mean_) / (self.scale_ + self.epsilon)
def inverse_transform(self, X):
return X * (self.scale_ + self.epsilon) + self.mean_
2. 分片+Pool多线程处理数据
- 使用Pool进行多线程处理,先对数据分片,然后用map对所有片同时处理。
def parallelize_df_func(df, func, num_partitions=NUM_PARTITIONS, n_jobs=N_JOBS):
df_split = np.array_split(df, num_partitions)
pool = Pool(n_jobs)
df = pd.concat(pool.map(func, df_split))
pool.close()
pool.join()
return df
3. 内存和速度
- 使用gc.collect清除释放内存,避免多次主动调用该函数,待了解。
gc.collect()
- 使用hash trick对输入空间的特征进行降维,与kernel trick实现输入到输出是线性映射的作用相反,待了解。PCA由于数据量实在太大而不太适合使用。
4. 离散化数据,热编码
- 有label encoder, label binarizer, onehot encoder.
- label encoder 处理成连续数字,label binarizer与onehot encoder区别在于 前者处理单列,后者可以处理多列,另外后者返回sparse matrix,如果label是多支label,可以用MultiLabelBinarizer.
2. 训练模型
- 使用贝叶斯优化hyperopt进行搜索最优参数。GridSearchCV暴力网格搜索不适合数据量大的情况。
from hyperopt import fmin, tpe, hp
best = fmin(
fn=lambda x: x,
space=hp.uniform('x', 0, 1),
algo=tpe.suggest,
max_evals=100,
trials=Trials())