主頁 >  其他 > “梧桐杯”中國移動大資料應用創新大賽 - 智慧城市賽道baseline

“梧桐杯”中國移動大資料應用創新大賽 - 智慧城市賽道baseline

2021-03-03 07:38:04 其他

開源一個0.827的baseline
沒做太多特征,讀資料,看分布,如果分布是長尾分布就加個變換
去掉相關系數低于0.05的特征
對某些在某些區間聚集較為明顯的特征分桶處理
網格調參,我還沒跳到最優,太慢了
采用xgb,rf融合模型
注釋已經很詳細了
進不去前14,拿不了復賽名額,就開源吧
是用jupyter寫的,ipynb檔案發到了大賽群里

#!/usr/bin/env python
# coding: utf-8

# In[1]:


import warnings
warnings.filterwarnings("ignore")

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns


# ## 讀取資料

# In[2]:


train_set = pd.read_csv('./train_set.csv')
train_set.head()


# ### 正樣本占比0.2

# In[3]:


train_label = pd.read_csv('./train_label.csv')
train_label[train_label['label'] == 1].shape[0] / train_label.shape[0]


# In[4]:


# 測驗集讀入
test = pd.read_csv('result_predict_A.csv')
test['label'] = -1
# test.info()


# In[5]:


# 全樣本構建,flag判斷是訓練集還是測驗集
train = pd.merge(train_set, train_label)
all_data = train.append(test).reset_index(drop='True')
all_data['flag'] = all_data['label'].map(lambda x: 'test' if x == -1 else 'train')
# all_data['X5'].mode()
all_data['X5'] = all_data['X5'].fillna('大眾用戶')
all_data[all_data['X6'].isnull() & (all_data['label'] == -1)]
all_data.head()


# In[91]:


all_data.info()


# ### 測驗集中X6到17缺失的人直接賦值0
# ### X5用眾數即大眾用戶填充

# ### X6,X7,X8具有強相關性,X4和userid有強相關性,X3,32,33和6,7,8有關系

# In[6]:


train.corr()  #3,6,7,8,32,33,24


# In[7]:


corr_dict = dict(train.corr()[train.corr() > 0.1].iloc[:, -1].dropna())
columns = list(corr_dict.keys())[:-1]    # 強相關的列


# ### 進一步分析相關性

# In[8]:


train['X5'] = train['X5'].fillna('大眾用戶')
set(train['X5'].to_list())


# ## 特征工程

# ### 考慮6-14要不要洗掉
# ### 24,28極強相關

# In[10]:


# columns = ['X3', 'X5', 'X15', 'X16', 'X17', 'X24', 'X29', 'X32', 'X34', 'X37', 'X39']
# columns = ['X' + str(i) for i in [3,5,6,7,8,9,10,11,12,13,14,15,16,17,24,29,32,33,34,37,39]]
columns = ['X' + str(i) for i in [3,5,6,7,8,9,12,15,16,17,24,29,32,34,37,38,39,41,42,43]]
columns.append('user_id')


# ### 嘗試加入其他特征

# In[11]:


all_data = all_data[[i for i in columns] + ['label', 'flag']]
all_data['X38'] = all_data['X38'].fillna(0)
all_data.head()


# In[12]:


all_data = all_data.dropna(axis=0, subset=['X16'])
all_data.info()


# 改變資料分布

# In[13]:


all_data['X8'] = np.log(all_data['X8'].values+1)
sns.kdeplot(all_data['X8'], color="Red", shade = True)


# In[14]:


all_data['X7'] = np.log(all_data['X7'].values+1)
sns.kdeplot(all_data['X7'], color="Red", shade = True)


# In[15]:


all_data['X6'] = np.log(all_data['X6'].values+1)
sns.kdeplot(all_data['X6'], color="Red", shade = True)


# In[16]:


all_data['X9'] = np.log(all_data['X9'].values+1)
sns.kdeplot(all_data['X9'], color="Red", shade = True)


# In[17]:


all_data['X15'] = np.log(all_data['X15'].values+1)
sns.kdeplot(all_data['X15'], color="Red", shade = True)


# In[18]:


all_data['X16'] = np.log(all_data['X16'].values+1)
sns.kdeplot(all_data['X16'], color="Red", shade = True)


# 新增特征

# In[19]:


def trans(x):
    if x <= 1:
        return 0
    elif x > 1 and x < 6:
        return 1
    else:
        return 2


# In[20]:


all_data['X16_range'] = all_data['X16'].apply(trans)


# In[21]:


all_data['X17'] = np.log(all_data['X17'].values+1)
sns.kdeplot(all_data['X17'], color="Red", shade = True)


# In[22]:


sns.kdeplot(all_data['X24'], color="Red", shade = True)


# In[23]:


sns.kdeplot(all_data['X29'], color="Red", shade = True)


# In[24]:


all_data.head()


# ### 用數字特征填補缺失值

# In[25]:


sns.kdeplot(all_data['X3'], color="Red", shade = True)
all_data['X3'] = all_data['X3'].fillna(3)


# In[26]:


sns.kdeplot(all_data['X29'], color="Red", shade = True)    # 24,32,33
all_data['X29'] = all_data['X29'].fillna(0)


# In[35]:


sns.kdeplot(all_data['X34'], color="Red", shade = True)    # 24,32,33
all_data['X34'] = all_data['X34'].fillna(0)


# In[27]:


all_data = pd.concat([pd.get_dummies(all_data['X5']), all_data], axis=1).drop('X5', axis=1)
all_data.head()


# 處理X32

# In[31]:


all_data['X32'] = np.log(all_data['X32'].values+1)
sns.kdeplot(all_data['X32'], color="Red", shade = True)


# In[ ]:


# 填充缺失值
from sklearn.ensemble import RandomForestRegressor
temp = all_data

# X32
known = temp[temp['X32'].notnull()]
unknown = temp[temp['X32'].isnull()]
X = known.drop(['user_id', 'X32', 'label', 'flag'], axis=1).values


y = known['X32'].values
rfr = RandomForestRegressor(random_state=0, n_estimators=100)
rfr.fit(X, y)
predict_X32 = rfr.predict(unknown.drop(['user_id', 'X32', 'label', 'flag'], axis=1).values)
all_data.loc[all_data['X32'].isnull(), 'X32'] = predict_X32


# 新增特征

# In[124]:


def transX32(x):
    if x < 2.7:
        return 0
    elif 2.7 <= x  < 3.15:
        return 1
    elif 3.15 <= x < 3.92:
        return 2
    elif 3.92 <= x < 4.4:
        return 3
    elif 4.4 <= x <4.9:
        return 3
    else:
        return 4


# In[125]:


all_data['X32_range'] = all_data['X32'].apply(transX32)


# In[128]:


del all_data['X38']


# ### 分割訓練集,驗證集,測驗集

# In[137]:


train = all_data[all_data['flag'] == 'train'].drop(['flag', 'user_id'], axis=1)
test = all_data[all_data['flag'] == 'test'].drop(['label', 'flag', 'user_id'], axis=1).reset_index(drop=True)


# In[140]:


import xgboost as xgb
from tqdm import tqdm
from xgboost.sklearn import XGBClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, f1_score  # 均方誤差
import catboost as cb


X_train, X_cv, y_train, y_cv = train_test_split(train.drop(['label'], axis=1), train['label'], test_size=0.2)


# ### 網格調參

# In[758]:


param_grid = [
{'n_estimators': list(range(100, 501, 100)), 'max_depth':list(range(2,21,5))}
]

rf = RandomForestClassifier()
grid_search_rf = GridSearchCV(rf, param_grid, cv=5,
                          scoring='f1')

grid_search_rf.fit(low_consume_train.drop(['label'], axis=1), low_consume_train['label'])
print(grid_search_rf.best_estimator_)    # max_depth=17,n_estimators=500


# In[760]:


param_dist = {
        'n_estimators':list(range(20, 141, 20)), # 120
        'max_depth':list(range(2,15,5)), # 7
        'learning_rate':list(np.linspace(0.01,2,5)), # 0.01
#         'subsample':list(np.linspace(0.7,0.9,5)),
#         'colsample_bytree':list(np.linspace(0.5,0.98,3)),
#         'min_child_weight':list(range(1,9,3)) # 6
        }

xgb = XGBClassifier()
grid_search_xgb = GridSearchCV(xgb, param_dist,cv = 3,n_jobs = -1, scoring='f1')

grid_search_xgb.fit(train.iloc[:, :-1], train['label'])
print(grid_search_xgb.best_estimator_)


# ### 驗證集效果

# In[141]:


train = all_data[all_data['flag'] == 'train'].drop(['flag', 'user_id'], axis=1)
test = all_data[all_data['flag'] == 'test'].drop(['label', 'flag', 'user_id'], axis=1).reset_index(drop=True)
X_train, X_cv, y_train, y_cv = train_test_split(train.drop(['label'], axis=1), train['label'], test_size=0.2)


# In[142]:


rf = RandomForestClassifier(n_estimators=500, max_depth=17).fit(X_train, y_train)
print('rf F1: {}' .format(f1_score(rf.predict(X_cv), y_cv)))


# In[143]:


xgb = XGBClassifier().fit(X_train, y_train)
print('xgb F1: {}' .format(f1_score(xgb.predict(X_cv), y_cv)))


# In[168]:


from sklearn.linear_model import LogisticRegression
for x in np.linspace(500, 1500, 10):
    clf3 = LogisticRegression(penalty='l2', C=0.1, max_iter=x, tol=1e-4, solver='lbfgs').fit(X_train, y_train)
    print(x)
    print('lr F1: {}' .format(f1_score(clf3.predict(X_cv), y_cv)))


# In[203]:


clf4 = cb.CatBoostClassifier(n_estimators=7000).fit(X_train, y_train)
print('catboost F1: {}' .format(f1_score(clf4.predict(X_cv), y_cv)))


# In[206]:


y_pred_1 = rf.predict_proba(X_cv)[:, 0]
y_pred_2 = clf4.predict_proba(X_cv)[:, 0]

y_pred = (y_pred_1 + y_pred_2 ) / 2
y_pred = list(map(lambda x: 1 if x<0.62 else 0, y_pred))
print(f1_score(y_pred, y_cv))


# 遍歷找到閾值
score_lst = []
for i in list(np.linspace(0.45,0.75,100)):
    i = round(i, 4)
    y_pred = (y_pred_1 + y_pred_2 ) / 2
    y_pred = list(map(lambda x: 1 if x<i else 0, y_pred))
    score = f1_score(y_pred, y_cv)
    score_lst.append([i, score])
    print('i={}, total F1: {}' .format(i, score))

score_lst = np.array(score_lst)
plt.plot(score_lst[:, 0], score_lst[:, 1])


# ### 預測

# In[1]:


clf1 = RandomForestClassifier(n_estimators=500, max_depth=17)
clf2 = cb.CatBoostClassifier(n_estimators=5000)

clf1.fit(train.drop(['label'], axis=1), train['label'])
print('訓練完了')
clf2.fit(train.drop(['label'], axis=1), train['label'])


# In[232]:


y_pred_1 = clf1.predict_proba(test)[:, 0]
y_pred_2 = clf2.predict_proba(test)[:, 0]

y_pred = (y_pred_1 + y_pred_2 ) / 2 
y_pred = list(map(lambda x: 1 if x<0.75 else 0, y_pred))


# 添加特殊用戶

# In[233]:


temp = pd.read_csv('result_predict_A.csv')
temp[temp['X16'].isnull()]


# In[190]:


extra = pd.DataFrame([['2697592699877', 0], ['2697527496793', 0], ['2697624945417', 0]], columns=['user_id', 'label'])
extra.head()


# In[234]:


result = pd.read_csv('result_predict_A.csv')
result = result.dropna(axis=0, subset=['X16'])


result['label'] = y_pred
result = result[['user_id', 'label']]

# 加入X16為NAN的三個樣本
result = result.append(extra)

result.head()


# In[235]:


result.shape


# In[236]:


result.to_csv('./submit.csv', index=False)


轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/265339.html

標籤:AI

上一篇:通過爬蟲實作twitter爬取

下一篇:java 面向物件 第一章:物件和封裝

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more