Contents
  1. 1. Read
  2. 2. Write
  3. 3. dataset convert
  4. 4. torch
  5. 5. 数据预处理
    1. 5.1. 过滤
      1. 5.1.1. 阈值过滤器
      2. 5.1.2. 移动平均滤波器
      3. 5.1.3. 中位数滤波器
    2. 5.2. 数据操作
    3. 5.3. 标准化
      1. 5.3.1. 分箱
      2. 5.3.2. 数据标准化
      3. 5.3.3. 二值化
    4. 5.4. 采样/拆分
  6. 6. 特征工程
    1. 6.1. 特征变换
      1. 6.1.1. PCA
      2. 6.1.2. OneHot
    2. 6.2. 特征重要性评估
      1. 6.2.1. 线性特征重要性评估
      2. 6.2.2. 随机森林特征重要性评估
    3. 6.3. 特征选择
      1. 6.3.1. 过滤式特征选择
  7. 7. 机器学习
    1. 7.1. 算法
      1. 7.1.1. 分类
        1. 7.1.1.1. 二分类
        2. 7.1.1.2. 多分类
        3. 7.1.1.3. 多标签分类
      2. 7.1.2. 回归/预测
      3. 7.1.3. 时间序列
        1. 7.1.3.1. SARIMA时间序列分析
        2. 7.1.3.2. LSTM时间序列分析
      4. 7.1.4. 聚类
        1. 7.1.4.1. KMeans
    2. 7.2. 预测
    3. 7.3. 评估
      1. 7.3.1. 二分类模型评估
      2. 7.3.2. 多分类模型评估
      3. 7.3.3. 回归模型评估
      4. 7.3.4. 聚类模型评估
    4. 7.4. 推荐系统
      1. 7.4.1. ALS

https://tensorflow.google.cn/resources/learn-ml/theoretical-and-advanced-machine-learning?hl=zh-cn

https://tensorflow.google.cn/tutorials/keras/classification?hl=zh-cn

http://c.biancheng.net/view/1881.html

https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/

Read

1
2
3
4
5
import pandas as pd
import idsw.hdfs as ih
hdfs = ih.client()
reader = hdfs.open('/user/1.csv', 'rb')
df = pd.read_csv(reader)

Write

1
2
with hdfs.open('/user/2.csv', 'wb')  as ff:
out.to_csv(ff,index=0,header=1)

dataset convert

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# do this for train and test dataset
raw_train_df = <uid,label,c1,c2,c3...>
raw_test_df = <uid,c1,c2,c3...>

train_uid=raw_train_df['acc_nbr']
train_y=raw_train_df['label'] # df.iloc[:,1] df.iloc[:,2:176]
train_X=raw_train_df.drop(['acc_nbr','label'], axis=1) # axis=0表示行,axis=1表示列

test_uid=raw_test_df.pop("acc_nbr")
test_X=raw_test_df

from sklearn.model_selection import train_test_split
#from imblearn.datasets import make_imbalance
#X_imb, y_imb = make_imbalance(train_X, train_y,sampling_strategy={1: 50000, 2: 338166, 3: 390000})
#X_train, X_test, y_train, y_test = train_test_split(X_imb, y_imb)
X_train, X_test, y_train, y_test = train_test_split(train_X, train_y)
train_X.shape
train_y=train_y-1

# predict for test dataset
test_fea=torch.from_numpy(test_X.values).float()
outputs = model(test_fea)
_, y_pred = torch.max(outputs.data, dim = 1)
y_pred=y_pred+1
y_pred

submit=pd.merge(test_uid, pd.Series(y_pred, name='label'), left_index=True, right_index=True)

check = pd.merge(submit, Feb_ans, on=['acc_nbr'])
y_predicted = check['label_x']
y_true = check['label_y']

accuracy = np.mean(y_predicted == y_true) * 100
print ("accuracy:",accuracy)
from sklearn.metrics import recall_score
print(recall_score(y_true,y_predicted,average = 'macro'))
from sklearn.metrics import classification_report
print(classification_report(y_true, y_predicted,labels=['1','2','3']))
1
2
3
4
5
6
7
8
9
10
import numpy as np
import torch
from torch.utils.data import DataLoader, TensorDataset
from torchvision import datasets, transforms

batch_size = 64
train_set = TensorDataset(torch.from_numpy(X_train.values).float(),torch.from_numpy(y_train.values))
test_set = TensorDataset(torch.from_numpy(X_test.values).float(),torch.from_numpy(y_test.values))
train_loader = DataLoader(train_set,batch_size=batch_size,shuffle=True,num_workers=4)
test_loader = DataLoader(test_set,batch_size=batch_size,shuffle=True,num_workers=4)

torch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from torch import nn
class Net(torch.nn.Module):
def __init__(self):
super(Net, self).__init__()
self.l1 = torch.nn.Linear(174, 256)
self.l2 = torch.nn.Linear(256, 128)
self.l3 = torch.nn.Linear(128, 64)
self.l4 = torch.nn.Linear(64, 8)
self.l5 = torch.nn.Linear(8, 3)

def forward(self, x):
x = x.view(-1, 174) # -1自动计算N,将(N,1, 28, 28) 变成 (N, 784)
x = F.relu(self.l1(x))
x = F.relu(self.l2(x))
x = F.relu(self.l3(x))
x = F.relu(self.l4(x))
return self.l5(x) # 最后一个不做激活
model = Net()

criterion = torch.nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum = 0.5) # momentum:带冲量的优化算法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#for i_batch, batch_data in enumerate(train_loader):
# print(i_batch) # 打印batch编号
# print(batch_data[0]) # 打印该batch里面src
# print(batch_data[1]) # 打印该batch里面trg

train_label

def train(epoch):
running_loss = 0.0
for batch_idx, data in enumerate(train_loader, 0):
inputs, target = data # 多分类中标签用数字的时候标签要从0开始算起
optimizer.zero_grad() # 优化器清零

outputs = model(inputs) # 获得预测值,forward
loss = criterion(outputs, target) # 获得损失值
loss.backward() # backward
optimizer.step() # update

running_loss += loss.item() # 注意加上item:不构成计算图
if batch_idx % 300 == 299:
print('[%d, %5d] loss: %.3f'%(epoch + 1, batch_idx + 1, running_loss / 300))
running_loss = 0.0

def test():
correct = 0
total = 0
with torch.no_grad(): # 不需要计算梯度
for data in test_loader:
features, labels = data
outputs = model(features)
_, predicted = torch.max(outputs.data, dim = 1) # 每一行的最大值下标
total += labels.size(0) # 测试了多少个数据
correct += (predicted == labels).sum().item() # 计算有多少个预测正确
print('Accuuracy on test set: %d %%' % (100 * correct / total)) # 输出正确率

for epoch in range(10):
train(epoch)
test()

数据预处理

过滤

阈值过滤器

移动平均滤波器

中位数滤波器

数据操作

  • 选择列
  • join
  • 删除重复行
  • 缺失值处理
  • 数学运算
  • 类型转换
  • 数据移动
  • 增加序列号
  • 更改列名
  • 替换值
  • 按列排序
  • 按值排序
  • 合并行
  • 合并列
  • 分组

标准化

标准化指将数据按比例缩放,使之落入一个小的特定区间。在某些比较和评价的指标处理中经常会用到,去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。

比如,在评价不同时期的物价指数时,较低价格的蔬菜和较高价格的家电的价格涨幅都可以被纳入其中,但是由于它们的价格水平差异较大,如果直接用其价格做分析,会使价格水平较高的家电在综合指数中的作用被放大。因此,为了保证结果的可靠性,需要对原始指标数据进行变换处理,使不同的特征具有相同的尺度。

分箱

数据标准化

MinMax标准化 - 归一化
公式:X’ = (X-Xmin) / (Xmax-Xmin)
处理后,该变量各个观察值的数值变化范围都满足0≤X’≤1
如果有新数据加入,就可能会导致最大值(Xmax)和最小值(Xmin)发生变化,就需要进行重新定义,并重新计算极差(R)

z-score标准化 - 规范化
新数据=(原数据- 均值)/ 标准差
当遇到某个指标的最大值和最小值未知的情况,或有超出取值范围的离群数值时,上面的方法就不再适用了,可以采用另一种数据标准化最常用的方法,即Z-score标准化,也叫标准差标准化法。

哪些算法需要标准化
1、涉及或隐含距离计算的算法,比如K-means、KNN、PCA、SVM等,一般需要进行标准化

2、梯度下降算法,梯度下降的收敛速度取决于:参数的初始位置到local minima的距离,以及学习率η的大小,其实还是距离的计算

3、采用sigmoid等有饱和区的激活函数,如果输入分布范围很广,参数初始化时没有适配好,很容易直接陷入饱和区,导致梯度消失,所以才会出现各种BN,LN等算法

哪些算法不需要标准化
与距离计算无关的概率模型不需要,比如Naive Bayes;

与距离计算无关的基于树的模型,比如决策树、随机森林等,树中节点的选择只关注当前特征在哪里切分对分类更好,即只在意特征内部的相对大小,而与特征间的相对大小无关。但是我们前几篇文章中说到了,使用Z-Score归一化会提高模型的准确率。其实归一化的作用就是由绝对变为了相对,所以可以说归一化对于树型模型不那么重要,是一个可选项或者说可以作为一个超参数在训练时进行选择。

二值化

采样/拆分

特征工程

特征变换

PCA

OneHot

特征重要性评估

线性特征重要性评估

随机森林特征重要性评估

特征选择

过滤式特征选择

机器学习

算法

分类

二分类

  • 朴素贝叶斯:条件概率公式
  • 逻辑回归:概率划分
  • 决策树:信息量划分
  • 随机森林:信息量划分
  • GBDT:信息量划分
  • SVM:空间划分
  • KNN:距离划分
  • FM因子分解机:概率划分
  • 神经网络
  • XGBoost:信息量划分
  • LightGBM

分类评估:F1

多分类

  • 朴素贝叶斯:条件概率公式
  • KNN:距离划分
  • 决策树:信息量划分
  • 随机森林:信息量划分
  • GBDT:信息量划分
  • 神经网络
  • XGBoost:信息量划分
  • LightGBM

分类评估:

  • Micro-F1:各样本一起计算
  • Macro-F1:各类计算F1求平均

多标签分类

每个样本可以预测位一个或多个类别

回归/预测

目标是连续的数值

  • 线性回归
  • 决策树回归
  • 随机森林回归
  • GBDT回归
  • 神经网络回归
  • XGBoost回归
  • LightGBM回归

时间序列

SARIMA时间序列分析

LSTM时间序列分析

聚类

KMeans

预测

评估

二分类模型评估

多分类模型评估

回归模型评估

聚类模型评估

推荐系统

ALS