貝殼房產問答匹配比賽 划水之旅

2021-10-12 12:57:57 字數 3982 閱讀 6424

乙個月前,參加了貝殼找房的房產問答匹配比賽,因為和我的方向比較契合都是屬於mrc的。第一次參加比賽,因此記錄一下。

參加比賽為了讓自己有實戰經驗,簡歷上可以寫上一筆。同時還可以獲取豐厚的獎金(雖然說基本不可能,但是夢想要是要有的),鍛鍊自己的code能力。可謂一舉多得(想的很美)。

1個問題對應多個回答,看對應的回答是否是乙個問答句。這不就是二分類問題。

輸入部分,在網上找到類似的**改了改。

def read_file():

train_query = pd.read_csv(path+'/train/train.query.tsv',sep='\t',header=none)

train_query.columns=['id','q1']

train_reply = pd.read_csv(path+'/train/train.reply.tsv',sep='\t',header=none)

train_reply.columns=['id','id_sub','q2','label']

df_train = train_query.merge(train_reply, how='left')

df_train['q2'] = df_train['q2'].fillna('好的')

test_query = pd.read_csv(path+'/test/test.query.tsv',sep='\t',header=none)

test_query.columns=['id','q1']

test_reply = pd.read_csv(path+'/test/test.reply.tsv',sep='\t',header=none)

test_reply.columns=['id','id_sub','q2']

df_test = test_query.merge(test_reply, how='left')

return df_train, df_test

模型利用huggface的api很快寫出了baseline。這麼簡單(too young too ******)。

之後就是不斷調參和修改**的過程,沒想到這部分才是最折磨人。

寫出乙個baseline,之後提交一看,f1= 0.75097 還不錯,(但是這就是我的最高分,之後再也沒有超過這個分數。。。)

當時沒想到還挺簡單,那且不是有機會拿獎了(心裡竊喜)。

但是沒想到。。。

好一波反向調優。。。 給自己鼓掌

當時在想是不是思路錯了,之後又寫了好幾個baseline,基於sentence-bert的語義匹配、抽取區域性資訊的text_cnn。但是效果並沒有提高。

是不是調優的姿勢不對啊,請教學長、請教同學。

首先 加上focal loss,對樣本不平衡的資料集可以關注較少的、較難的類別。

class focalloss(nn.module):

def __init__(self, gamma=2, weight=none, reduction='mean'):

super(focalloss, self).__init__()

self.gamma = gamma

self.weight = weight

self.reduction = reduction

def forward(self, output, target):

# convert output to pseudo probability

out_target = torch.stack([output[i, t] for i, t in enumerate(target)])

probs = torch.sigmoid(out_target)

focal_weight = torch.pow(1-probs, self.gamma)

# add focal weight to cross entropy

ce_loss = f.cross_entropy(output, target, weight=self.weight, reduction='none')

focal_loss = focal_weight * ce_loss

if self.reduction == 'mean':

focal_loss = (focal_loss/focal_weight.sum()).sum()

elif self.reduction == 'sum':

focal_loss = focal_loss.sum()

return focal_loss

這波應該穩了,**提交一氣呵成。然而並沒有用。

嗯,還不能放棄,考慮考慮對抗學習,樣本量這麼少。果斷加上對抗訓練fast gradient method。

class fgm():

def __init__(self, model):

self.model = model

self.backup = {}

def attack(self, epsilon=1., emb_name='bert.embeddings.word_embeddings.weight'):

# emb_name這個引數要換成你模型中embedding的引數名

for name, param in self.model.named_parameters():

if param.requires_grad and emb_name in name:

self.backup[name] = param.data.clone()

norm = torch.norm(param.grad)

if norm != 0 and not torch.isnan(norm):

r_at = epsilon * param.grad / norm

param.data.add_(r_at)

def restore(self, emb_name='bert.embeddings.word_embeddings.weight'):

# emb_name這個引數要換成你模型中embedding的引數名

for name, param in self.model.named_parameters():

if param.requires_grad and emb_name in name:

assert name in self.backup

param.data = self.backup[name]

self.backup = {}

這波應該錯不了了,信心滿滿。訓練、**、提交。但是分數絲毫沒變。。。。

這,,,心態**。

好吧,之後就慢慢放棄這個比賽,並沒有什麼所謂的逆襲,,,(菜雞好慘)

雖然這次比賽並沒有拿到很好的名次,但是我也從中學習了不少(自我安慰。。),學習了不少小技巧。雖然在比賽並沒有什麼用。賽後,我也搜尋了一些相關參賽的**,人家的baseline的效果都能達到78(比我高了三個點),仔細看看,基本思路一致。都是看作分類問題,但是人家使用五折交叉驗證。好吧,誰叫自己沒有學習機器學習相關知識。。。直接上手深度學習。對於基本的一些機器學習技巧都不知道。。。對於樣本量比較少的資料來說,n折交叉驗證是乙個不浪費資料的乙個好方法。之後,如果sota的方法出來,我也會去學習的。

最後的最後,如果感覺能有大佬帶著參加比賽,會少走很多彎路,如果能和大佬組隊,肯定會學到不少。(那個大佬來帶帶我)。。。

仿貝殼房產中介ERP管理系統

軟體簡介 首家100 開源可定製的仿貝殼房產中介erp管理系統,手機 電腦 微信 pad同步使用,內網 外網高階結合,四網合 一 一站同步 提高工作效率 安全可靠 操作簡單。詳細介紹 開源可定製仿貝殼房產erp解決方案 功能完善的 客源管理,同時提供完備的辦公 財務 決策分析方案,內外一體全面打通 ...

貝殼找房面試之c 基礎問答

1.設計模式了解嗎?2.c 物件導向的方式 面向過程的程式設計思路是,解決乙個問題分別幾個步驟,使用函式來完成各個步驟的任務,不同函式具有不同的功能,按照程式執行的順序呼叫函式,組成乙個可以執行的程式。c 物件導向將問題模組化,抽象出各種類,類包含資料和對資料的操作,將類例項化就得到乙個具體的物件,...

貝殼找房IPO,房產電商依舊難走

配圖來自canva 終於,貝殼找房遞交招股書,赴美ipo。貝殼找房作為全國第二大交易平台,由線下地產經紀巨頭鏈家轉型而來。而此前鏈家一直是中國最大的地產經紀品牌,其綠底白字的招牌一直是深夜城市中最吸引眼球的存在,點綴在城市之中。兩年前的鏈家,覆蓋了全國28個城市,擁有八千多間直營門店。而兩年後,貝殼...