File size: 1,634 Bytes
9e55601
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
39
40
41
42
43
44
45
46
47
48
import torch
import torch.nn as nn
import torch.nn.functional as F

class DeepGBM(nn.Module):
    def __init__(self, num_features, cat_features, num_classes, d_main=128, d_hidden=64, n_blocks=4, dropout=0.2):
        super(DeepGBM, self).__init__()

        self.num_classes = num_classes
        
        # ์—ฐ์†ํ˜• ๋ณ€์ˆ˜ ์ฒ˜๋ฆฌ (Linear)
        self.num_linear = nn.Linear(num_features, d_main)

        # ๋ฒ”์ฃผํ˜• ๋ณ€์ˆ˜ ์ฒ˜๋ฆฌ (Embedding)
        self.cat_embedding = nn.ModuleList([
            nn.Embedding(cat_size, d_main) for cat_size in cat_features
        ])

        # ResNet-like ๋ธ”๋ก
        self.blocks = nn.ModuleList([
            nn.Sequential(
                nn.Linear(d_main, d_hidden),
                nn.ReLU(),
                nn.Dropout(dropout),
                nn.Linear(d_hidden, d_main),
                nn.ReLU()
            ) for _ in range(n_blocks)
        ])

        if num_classes == 2:
            self.output_layer = nn.Linear(d_main, 1)  # Binary classification
        elif num_classes > 2:
            self.output_layer = nn.Linear(d_main, num_classes)  # Multi classification

    def forward(self, x_num, x_cat):  # ๋‘ ๊ฐœ์˜ ์ž…๋ ฅ์„ ๋ฐ›์Œ
        x_num = self.num_linear(x_num)

        # ๋ฒ”์ฃผํ˜• ๋ณ€์ˆ˜๋ฅผ ์ž„๋ฒ ๋”ฉ ํ›„ ํ•ฉ์‚ฐ
        x_cat = [embed(x_cat[:, i]) for i, embed in enumerate(self.cat_embedding)]
        x_cat = torch.stack(x_cat, dim=1).sum(dim=1)  
        x = x_num + x_cat  # ์—ฐ์†ํ˜• + ๋ฒ”์ฃผํ˜• ๊ฒฐํ•ฉ
        
        for block in self.blocks:
            x = x + block(x)  # Residual connection
        x = self.output_layer(x)
        
        return x