日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

10万元奖金“智源工业检测赛”激战正酣!高分Baseline合辑带你入门智能制造

發布時間:2024/10/8 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 10万元奖金“智源工业检测赛”激战正酣!高分Baseline合辑带你入门智能制造 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

百年德企博世放出真實獨家生產場景脫敏數據,邀你為工業 4.0 制造練就 AI 大腦。

目前,由北京智源人工智能研究院聯合博世和?biendata?共同發布的“INSPEC?工業大數據質量預測賽”(2019 年 12 月 — 2020 年 4 月)正在火熱進行中,總獎金為 10 萬元。

比賽發布了博世某系列產品近年來的質量檢測相關數據,要求選手根據已有產品質檢環節記錄的相關參數,使用機器學習算法對正在測試的產品進行質量預測,提前判斷次品,節省整體檢測時間。比賽和數據可于下方鏈接查看,或點擊“閱讀原文”,歡迎所有感興趣的報名讀者參賽

目前,賽事已接近半程,為幫助選手進一步提升模型預測結果,biendata 邀請的四名活躍選手:pinlan(2019 數字中國混泥土砼活塞故障預警冠軍)、bestIteration(JData 亞軍、2019 KDD Top 10)、sijinabc、hh_neuq 分享四個分數在 0.6 左右的 baseline ,希望可以為大家在數據探索、特征工程、模型選擇、參數調優等方面提供參考和思路。

比賽地址:

https://www.biendata.com/competition/bosch/?

1

Baseline 概覽

(一)選手 pinlan 首先根據題意將賽題歸為二分類問題,在樣本構造方面,該選手建議樣本應和官方提供 validation 相似,并認為樣本構造方法可能是上分關鍵。

在特征工程上,選手 pinlan:1)針對產品實例 Product_ID 構造統計特征:最值,均值;2)對類別特征進行編碼;3)構思一些具有背景意義的特征;4)提示工業數據一般暗含很多規則,一些數據探索分析可以幫助發現規則,有助于分數提升。

pinlan 采用 5 fold 劃分數據集,并選用 LightGBM 模型。該 Baseline 最終線上成績為 0.6,具體代碼實現歡迎訪問以下頁面查看或瀏覽下文。

https://biendata.com/models/category/4063/L_notebook/

(二)選手 bestIteration 首先分析了目標變量分布、缺失值比例、類別變量分布差異等,總結出兩種建模思路:1)構造產品實例(ID_F_PROCESS)的特征,預測其最終是否合格;2)構造產品中檢測步驟的特征,預測該檢測步驟結果是否合格,再進一步得到對應產品實例最終是否合格。

關于特征工程,bestIteration 主要聚焦于對連續值的統計特征(如 RESULT_VALUE)、每個檢測步驟中 RESULT_VALUE 的統計特征、對類別變量的 TFIDF 特征(如 ID_F_PARAMETER_S)。該選手選用 LightGBM 模型,并使用 5 折交叉驗證。該 Baseline 最終線上成績為 0.61+,具體代碼實現歡迎以下訪問頁面查看。

https://biendata.com/models/category/4239/L_notebook/

(三)選手 sijinabc 經過對數據的理解,其分類模型將在以下幾點假設的基礎上建立:1)對于產品檢測的過程數據,不同檢測步驟之間互不影響,因此認為檢測數據不存在時間序列關系;2)對于各檢測序列中正常的檢測數據,不同產品之間的數值差別可以體現產品的不同質量;3)不同產品的檢測序列長度、檢測順序、檢測內容不同,模型需有較好的泛化性,注意防止過擬合。

其主要思路為:

1)簡化數據表,減小數據維度;

2)建立訓練集,其中包括將檢測參數序列號(ID_F_PARAMETER_S )順序排列作為特征名;對應的數值型檢測結果(RESULT_VALUE)或參數檢測結果(PARAMETER_RESULT_STATE)作為模型特征;產品實例的最終檢測結果(PROCESS_RESULT_STATE)作為樣本標簽;分別取前四個、前十個檢測步驟的序列 ID(ID_F_PHASE_S)0~9 對應的檢測參數序列及檢測結果用于訓練模型;識別并刪除異常數據。

3)建立二分類模型。該 Baseline 最終線上成績為 0.6,具體代碼實現歡迎訪問以下頁面查看。

https://biendata.com/models/category/4224/L_notebook/

(四)選手 hh_neuq 首先讀取 Excel 格式數據,將小文件合并成三個大文件,并轉為 csv 格式文件存儲。然后對數據進行篩選,并提取特征,用 LightGBM 建模。該選手認為,可以深入可視化,進而提取特征,并對模型進行調參。

該 Baseline 最終線上成績為 0.57,具體代碼實現歡迎訪問以下頁面查看。

https://biendata.com/models/category/4298/L_notebook/

2

Baseline 詳情

pinlan 版?

本 baseline 線上成績為 0.6。

1. 賽題引入與問題分析

本次比賽的任務為產品質量預測,所使用數據為“INSPEC 工業檢測大數據“,其中包含博世某產品家族的工廠生產環節的檢測參數,要求選手根據訓練集中產品的相關數據(如子家族名稱、檢測流程、檢測結果)建立和優化模型,并參照目標產品中已完工序的檢測結果,預測最終產品檢測的結果為合格或不合格。

賽題線上驗證集已經由官方提取完畢,訓練數據需要自行提取。官方提供了以產品類型-子家族(TYPE_NUMBER-PRODUCTGROUP_NAME)命名的 excel 表格,每個表格下包含產品實例表,檢測步驟表和步驟參數表三個表。

整體思路

1. 根據官方發布的題目,明確題目含義:參照目標產品中已完工序的檢測結果,預測 "最終產品" 檢測的結果為合格或不合格。

  • 根據題意,作者將題目定義為二分類問題;

  • 先建立 valid_4 模型,再建立 valid_11 模型,建模流程相同。

2. 訓練樣本構造,樣本應和官方提供 validation 相似,這里樣本構造方法可能是上分關鍵,這里提供本人樣本構建方法(get_data 函數),以及部分思考。

  • 樣本越多,效果越好;

  • 官方驗證集未包含全部子家族以及產品類型,在提取訓練集時是否刪去官方驗證集未包含的子家族;

  • 對于 validation_predict_4 而言,提取訓練數據應包含產品實例前三步檢測數據,這里進行了數據篩選,剔除了前三部已經檢測出問題的產品。

3. 特征工程:

  • 針對產品實例 Product_ID 構造統計特征:最值,均值;

  • 對類別特征進行編碼;

  • 構思一些具有背景意義的特征;

  • 工業數據一般暗含很多規則,一些 EDA 可以幫助發現規則,有助于分數提升。

4. 采用 5 fold 劃分數據集。

5. lightgbm 模型,模型可自選:

  • 正負樣本極不平衡;

  • 主要在于不平衡樣本的處理,如使用采樣,is_unbalance 參數;

  • 模型方面小數據集分類問題 Catboost 可能更具有優勢。

6. 評價指標 F1。

  • F1 需要設置閾值,閾值對結果影響很大,概率、排序或者搜索算法等都可以;

  • F1 不單考慮某一類樣本的準確性,需要正負樣本預測準確性都高。

7. 劃重點:

  • 訓練樣本構造以及篩選方式,十分重要;

  • 特征工程。

2. 數據提取與探索性分析

import numpy as np import pandas as pd import gc import os import math import lightgbm as lgb from sklearn.metrics import f1_score,accuracy_score,roc_auc_score from sklearn.model_selection import StratifiedKFold,KFold,train_test_split import matplotlib.pyplot as plt %matplotlib inline import seaborn as sns color = sns.color_palette() sns.set_style("whitegrid") import warnings warnings.filterwarnings('ignore') path='./INSPEC_train/' test_path='./INSPEC_validation/' filename=os.listdir('./INSPEC_train/') data_cols = ['Product_ID', 'TYPE_NUMBER', 'PRODUCTGROUP_NAME', 'ID_F_PHASE','PHASE_RESULT_STATE', 'PHASE_NAME', 'ID_F_PHASE_S','RESULT_STRING','RESULT_VALUE', 'PARAMETER_RESULT_STATE', 'LOWER_LIMIT', 'UPPER_LIMIT','AXIS', 'SIDE', 'ID_F_PARAMETER_S']

2.1 數據提取

2.1.1?數據組成

a)?產品實例表:產品實例的 ID,產品實例的最終檢測結果(1 為合格、2 為不合格),產品類型名,產品類型所在子家族。

b)?檢測步驟表:產品實例的 ID,檢測步驟的 ID,檢測步驟的結果,檢測步驟的名稱,檢測步驟的序列 ID。

c)?步驟參數表:檢測步驟 ID,字符串類型檢測結果(表示產品等級),數值型檢測結果,該參數檢測結果,數值型檢測可供參考的上下限,產品的軸、產品的面,檢測步驟的序列 ID,檢測參數的序列號。

2.1.2?對單個產品類型表格提取數據(get_data 函數)

a)?以每個產品類型 excel 為基礎,包括產品實例表、檢測步驟表和步驟參數表三個表。

b)?將三個數據表合并,對于驗證集 4 提取檢測步驟 ID_F_PHASE_S<3 的數據。

c)?將訓練數據與驗證數據比較,刪除多余字段,使訓練集與驗證集具有相同形式。

2.1.3?將單個表提取數據合并為訓練數據,其中 Product_ID 為樣本編號,label 為標簽 (get_train4)。

def get_data(path, data_cols, file_dir, num):process = pd.read_excel(path+file_dir, sheet_name='Process_Table')phase = pd.read_excel(path+file_dir, sheet_name='Phase_Table')parameters = pd.read_excel(path+file_dir, sheet_name='Parameters_Table')del parameters['ID_F_PHASE_S'];gc.collect()df = process.merge(phase, on = 'ID_F_PROCESS', how = 'left')df = df.merge(parameters, on = 'ID_F_PHASE', how = 'left')df.rename(columns={'ID_F_PROCESS':'Product_ID','PROCESS_RESULT_STATE':'label'}, inplace=True)df = df[data_cols+['label']]bad_id = df[(df['ID_F_PHASE_S'] < num)&(df['PHASE_RESULT_STATE'] == 2)]['Product_ID'].unique()df = df[~df['Product_ID'].isin(bad_id)]df = df[df['ID_F_PHASE_S'] < num].reset_index(drop=True)del process, phase, parameters;gc.collect()return dfdef get_train4(path, data_cols, filename):try:train_4 = pd.read_csv('train_4.csv')except:train_4 = pd.DataFrame()for dir_file in tqdm(filename):temp_df = get_data(path, data_cols, dir_file, 3)train_4 = train_4.append(temp_df)train_4 = train_4.reset_index(drop=True)train_4.to_csv('train_4.csv', index=False)return train_4

2.2?探索性分析

主要特征:?

1)檢測方面:產品的軸、產品的面;

2)檢測結果:RESULT_STRING,RESULT_VALUE,LOWER_LIMIT,UPPER_LIMI;

3)其他描述性類別特征。

train_4 = get_train4(path, data_cols, filename) train_4.head() train_4.describe() plt.rcParams['font.sans-serif']=['SimHei'] train_4.drop_duplicates(subset=['Product_ID'])['label'].value_counts().plot.pie(autopct='%1.1f%%',title = '正負樣本比例') <matplotlib.axes._subplots.AxesSubplot at 0x2375cb20f98>

train_4.nunique().plot.bar(title='類別個數') <matplotlib.axes._subplots.AxesSubplot at 0x2375cbbfb70>

(train_4.isnull().sum()/len(train_4)).plot.bar(title='缺失值比例') <matplotlib.axes._subplots.AxesSubplot at 0x2375cc6b9b0>

標簽在檢測參數的序列號 ID_F_PARAMETER_S 上面變化大,可以看出說明檢測步驟越多,產品越緊密,制作難度越大。

train_4.groupby('label')['ID_F_PARAMETER_S'].agg(['min', 'max', 'median','mean', 'std'])?

train_4.groupby(['label'])['RESULT_VALUE'].describe()

正常來說,產品尺寸好壞要通過尺寸與公差上下極限關系來判斷,因此可以考慮 RESULT_VALUE 和 LOWER_LIMIT 以及 UPPER_LIMIT 關系,構造特征:做差。可以看出距離上下限差值越大,產品越容易在制作時損壞。?

temp = train_4[['Product_ID','RESULT_VALUE', 'LOWER_LIMIT', 'UPPER_LIMIT','label']].dropna() temp.head(10)

temp['差值'] = temp['RESULT_VALUE'] - temp['LOWER_LIMIT'] / (temp['UPPER_LIMIT'] - temp['LOWER_LIMIT']) temp.groupby('label')['差值'].describe()

3

代碼分析

import numpy as np import pandas as pd import gc import os import math import lightgbm as lgb from sklearn.metrics import f1_score,accuracy_score,roc_auc_score from sklearn.model_selection import StratifiedKFold,KFold,train_test_split path='./INSPEC_train/' test_path='./INSPEC_validation/' filename=os.listdir('./INSPEC_train/') data_cols = ['Product_ID', 'TYPE_NUMBER', 'PRODUCTGROUP_NAME', 'ID_F_PHASE','PHASE_RESULT_STATE', 'PHASE_NAME', 'ID_F_PHASE_S','RESULT_STRING','RESULT_VALUE', 'PARAMETER_RESULT_STATE', 'LOWER_LIMIT', 'UPPER_LIMIT','AXIS', 'SIDE', 'ID_F_PARAMETER_S']

valid4 建模

#提取訓練數據def get_data(path, data_cols, file_dir, num):process = pd.read_excel(path+file_dir, sheet_name='Process_Table')phase = pd.read_excel(path+file_dir, sheet_name='Phase_Table')parameters = pd.read_excel(path+file_dir, sheet_name='Parameters_Table')del parameters['ID_F_PHASE_S'];gc.collect()df = process.merge(phase, on = 'ID_F_PROCESS', how = 'left')df = df.merge(parameters, on = 'ID_F_PHASE', how = 'left')df.rename(columns={'ID_F_PROCESS':'Product_ID','PROCESS_RESULT_STATE':'label'}, inplace=True)df = df[data_cols+['label']]bad_id = df[(df['ID_F_PHASE_S'] < num)&(df['PHASE_RESULT_STATE'] == 2)]['Product_ID'].unique()df = df[~df['Product_ID'].isin(bad_id)]df = df[df['ID_F_PHASE_S'] < num].reset_index(drop=True)del process, phase, parameters;gc.collect()return df #合并數據def get_train4(path, data_cols, filename):try:train_4 = pd.read_csv('train_4.csv')except:train_4 = pd.DataFrame()for dir_file in tqdm(filename):temp_df = get_data(path, data_cols, dir_file, 3)train_4 = train_4.append(temp_df)train_4 = train_4.reset_index(drop=True)train_4.to_csv('train_4.csv', index=False)return train_4 #構造統計特征def make_feature(data,aggs,name,data_id):agg_df = data.groupby(data_id).agg(aggs)agg_df.columns = agg_df.columns = ['_'.join(col).strip()+name for col in agg_df.columns.values]agg_df.reset_index(drop=False, inplace=True)return agg_df #產品實例統計特征def get_4_fe(data,cate_cols):dd_cols = ['PHASE_RESULT_STATE', 'RESULT_STRING','PARAMETER_RESULT_STATE']data.drop(columns=dd_cols, inplace=True)data['ID_F_PHASE_S'] = data['ID_F_PHASE_S'].astype('int8')df = data[['Product_ID', 'label'] + cate_cols].drop_duplicates()aggs = {}for i in ['RESULT_VALUE']:aggs[i] = ['min', 'max', 'mean', 'std', 'median']for i in ['PHASE_NAME', 'AXIS']:aggs[i] = ['nunique']aggs['ID_F_PARAMETER_S'] = ['max', 'std', 'mean', 'median', 'count']temp = make_feature(data, aggs, "_product", 'Product_ID')df = df.merge(temp, on = 'Product_ID', how='left')return df #根據數值檢測結果上下限構造統計def get_limit_4(data,df):temp = data[['Product_ID','RESULT_VALUE', 'LOWER_LIMIT', 'UPPER_LIMIT']].dropna()temp['差值'] = temp['RESULT_VALUE'] - temp['LOWER_LIMIT'] / (temp['UPPER_LIMIT'] - temp['LOWER_LIMIT'])aggs = {}aggs['差值'] = ['min', 'max', 'mean']temp_df = make_feature(temp, aggs, "_limit", 'Product_ID')df = df.merge(temp_df, on = 'Product_ID', how='left')return df #目標編碼def get_target_mean_4(df, cate_cols):for i in cate_cols:df[f'{i}_label_mean'] = df.groupby(i)['label'].transform('mean')return df #建模數據def get_training_data(df, name):train_4 = df[~df['label'].isnull()].reset_index(drop=True)test_4 = df[df['label'].isnull()].reset_index(drop=True)col = [i for i in train_4.columns if i notin ['Product_ID', 'label']]X_train = train_4[col]y_train = (train_4['label']-1).astype(int)X_test = test_4[col]sub = test_4[['Product_ID']].copy()print('{} train shape {} and test shape {}'.format(name, X_train.shape, X_test.shape))return X_train, y_train, X_test, sub

1. 提取數據

train_4 = get_train4(path, data_cols, filename) test_4 = pd.read_csv(test_path + 'validation_predict_4.csv') train_4 = train_4[train_4['PRODUCTGROUP_NAME'].isin(test_4['PRODUCTGROUP_NAME'].unique())] data_4 = train_4.append(test_4).reset_index(drop=True) data_4.loc[data_4['AXIS'] == -9.223372036854776e+18, 'AXIS'] = np.nan print('val_4 train sample {} and test sample {}'.format(train_4['Product_ID'].nunique(), test_4['Product_ID'].nunique()))

val_4 train sample 16441 and test sample 3721?

2. 特征工程

cate_cols = ['TYPE_NUMBER', 'PRODUCTGROUP_NAME'] df4 = get_4_fe(data_4,cate_cols) df4 = get_limit_4(data_4,df4) df4 = get_target_mean_4(df4,cate_cols) df4['TYPE_NUMBER'] = df4['TYPE_NUMBER'].astype('category') df4['PRODUCTGROUP_NAME'] = df4['PRODUCTGROUP_NAME'].astype('category') #構建標簽 X_train, y_train, X_test, sub1 = get_training_data(df4, 'val_4')

val_4 train shape (16441, 19) and test shape (3721, 19)?

3. 模型訓練

lgb 自定義評測 f1 評測:

def lgb_f1_score(y_hat, data):y_true = data.get_label()y_hat = np.round(y_hat)return'f1', f1_score(y_true, y_hat), True

五折劃分數據,lgb 參數設置:

K = 5 seed = 2020 skf = StratifiedKFold(n_splits=K, shuffle=True, random_state=seed) lgb_params = {'boosting_type': 'gbdt','objective': 'binary','metric': 'None','num_leaves': 63,'subsample': 0.8,'colsample_bytree': 0.8,'learning_rate': 0.05,'lambda_l2':2,'nthread': -1,'silent': True} f1_scores = [] oof = np.zeros(len(X_train)) predictions = np.zeros(len(X_test)) feature_importance_df = pd.DataFrame()for i, (train_index, val_index) in enumerate(skf.split(X_train,y_train)):print("fold{}".format(i))X_tr, X_val = X_train.iloc[train_index], X_train.iloc[val_index]y_tr, y_val = y_train.iloc[train_index], y_train.iloc[val_index]lgb_train = lgb.Dataset(X_tr,y_tr)lgb_val = lgb.Dataset(X_val,y_val)num_round = 3000clf = lgb.train(lgb_params, lgb_train, num_round, valid_sets = [lgb_train, lgb_val], feval=lgb_f1_score,categorical_feature=['TYPE_NUMBER', 'PRODUCTGROUP_NAME'],verbose_eval=100, early_stopping_rounds = 100)oof[val_index] = clf.predict(X_val, num_iteration=clf.best_iteration)pred = clf.predict(X_val, num_iteration=clf.best_iteration)sc = f1_score(y_val, np.round(pred))f1_scores.append(sc)print(f'fold{i} f1 score = ',sc)print('best iteration = ',clf.best_iteration)fold_importance_df = pd.DataFrame()fold_importance_df["Feature"] = clf.feature_name()fold_importance_df["importance"] = clf.feature_importance()fold_importance_df["fold"] = i + 1feature_importance_df = pd.concat([feature_importance_df, fold_importance_df], axis=0)predictions += clf.predict(X_test, num_iteration=clf.best_iteration) / skf.n_splits print('val_4 訓練f1均值: {},波動: {}.'.format(np.mean(f1_scores), np.std(f1_scores))) print('val_4 macro F1 score: ',f1_score(y_train, np.round(oof),average='macro'))

4. 特征重要性

plt.figure(figsize=(12,8)) sns.barplot(y='Feature', x='importance',data=feature_importance_df) plt.title('val_4特征重要性')

Text (0.5,1,'val_4特征重要性')

5.?生成 val4 結果

sub1['label'] = predictions sub1['label'] = sub1['label'].rank() sub1['label'] = (sub1['label']>=sub1.shape[0] * 0.93).astype(int) sub1['label'] = (sub1['label'] + 1).astype(int) sub1.rename(columns={'Product_ID':'id'}, inplace=True) print('val_4正負樣本比例:\n', sub1['label'].value_counts())

val_4 正負樣本比例:


1 3460?

2 261?

Name: label, dtype: int64?

這里結合數據和結果發現規則:結果中發現一個產品實例只有三條檢測記錄的正常樣本居多,直接全部賦值 1,大概有百分位提升,但更換數據集后效果未知。

rule = test_4['Product_ID'].value_counts() rule = rule[rule==3].index.values sub1.loc[sub1['id'].isin(rule), 'label'] = 1 print('val_4正負樣本比例:\n', sub1['label'].value_counts())

val_4?正負樣本比例:

1 3609?

2?112?

Name: label, dtype: int64?

valid11 建模

#合并數據def get_train11(path, data_cols, filename):try:train_11 = pd.read_csv('train_11.csv')except:train_11 = pd.DataFrame()for dir_file in tqdm(filename):temp_df = get_data(path, data_cols, dir_file, 10)train_11 = train_11.append(temp_df)train_11 = train_11.reset_index(drop=True)train_11.to_csv('train_11.csv', index=False)return train_11 #產品實例統計特征def get_11_fe(data_11, cate_cols):dd_cols = ['PHASE_RESULT_STATE', 'PARAMETER_RESULT_STATE']data_11.drop(columns=dd_cols, inplace=True)data_11['ID_F_PHASE_S'] = data_11['ID_F_PHASE_S'].astype('int8')df = data_11[['Product_ID', 'label'] + cate_cols].drop_duplicates()aggs = {}for i in ['RESULT_VALUE']:aggs[i] = ['min', 'max', 'mean', 'std', 'median']for i in ['PHASE_NAME', 'AXIS', 'SIDE', 'RESULT_STRING']:aggs[i] = ['nunique']aggs['ID_F_PARAMETER_S'] = ['max', 'std', 'mean', 'count']temp = make_feature(data_11, aggs, "_product", 'Product_ID')df = df.merge(temp, on = 'Product_ID', how='left')return df #根據數值檢測檢測上下限構造統計def get_limit_11(data,df):temp = data[['Product_ID','RESULT_VALUE', 'LOWER_LIMIT', 'UPPER_LIMIT']].dropna()temp['差值'] = temp['RESULT_VALUE'] - temp['LOWER_LIMIT'] / (temp['UPPER_LIMIT'] - temp['LOWER_LIMIT'])aggs = {}aggs['差值'] = ['min', 'max', 'mean']temp_df = make_feature(temp, aggs, "_limit", 'Product_ID')df = df.merge(temp_df, on = 'Product_ID', how='left')return df #類別特征def get_cate_11(data, df, cate_cols):df['TYPE_NUMBER'] = df['TYPE_NUMBER'].astype('category')df['PRODUCTGROUP_NAME'] = df['PRODUCTGROUP_NAME'].astype('category')temp = pd.pivot_table(data=data, index='Product_ID',values='RESULT_VALUE',columns='SIDE',aggfunc='min').reset_index()df = df.merge(temp, on = 'Product_ID', how='left')temp = pd.pivot_table(data=data, index='Product_ID',values='RESULT_VALUE',columns='AXIS',aggfunc='min').reset_index()df = df.merge(temp, on = 'Product_ID', how='left')temp = pd.pivot_table(data=data, index='Product_ID',values='RESULT_VALUE',columns='RESULT_STRING',aggfunc='count').reset_index()df = df.merge(temp, on = 'Product_ID', how='left')for i in cate_cols:df[f'{i}_label_mean'] = df.groupby(i)['label'].transform('mean')return df

1. 提取數據

train_11 = get_train11(path, data_cols, filename) test_11 = pd.read_csv(test_path + 'validation_predict_11.csv') train_11 = train_11[train_11['PRODUCTGROUP_NAME'].isin(test_11['PRODUCTGROUP_NAME'].unique())] data_11 = train_11.append(test_11).reset_index(drop=True) data_11.loc[data_11['AXIS'] == -9.223372036854776e+18, 'AXIS'] = np.nan print('val_11 train sample {} and test sample {}'.format(train_11['Product_ID'].nunique(), test_11['Product_ID'].nunique()))

val_11 train sample 13051 and test sample 3784

2. 特征工程

cate_cols = ['TYPE_NUMBER', 'PRODUCTGROUP_NAME'] df11 = get_11_fe(data_11, cate_cols) df11 = get_limit_11(data_11, df11) df11 = get_cate_11(data_11, df11, cate_cols)# 構建標簽 X_train, y_train, X_test, sub2 = get_training_data(df11, 'val_11')

val_11 train shape (13051, 36) and test shape (3784, 36)?

3. 模型訓練?

五折劃分數據,lgb 參數設置:

K = 5 seed = 2020 skf = StratifiedKFold(n_splits=K, shuffle=True, random_state=seed) lgb_params = {'boosting_type': 'gbdt','objective': 'binary','metric': 'None','num_leaves': 32, # 'is_unbalance': True,'subsample': 0.9,'colsample_bytree': 0.9,'learning_rate': 0.05,'lambda_l2':1, # 'min_data_in_leaf':10,'nthread': -1,'silent': True} f1_score2 = [] oof = np.zeros(len(X_train)) predictions2 = np.zeros(len(X_test)) feature_importance_df = pd.DataFrame()for i, (train_index, val_index) in enumerate(skf.split(X_train,y_train)):print("fold_{}".format(i))X_tr, X_val = X_train.iloc[train_index], X_train.iloc[val_index]y_tr, y_val = y_train.iloc[train_index], y_train.iloc[val_index]lgb_train = lgb.Dataset(X_tr,y_tr)lgb_val = lgb.Dataset(X_val,y_val)num_round = 3000clf = lgb.train(lgb_params, lgb_train, num_round, valid_sets = [lgb_train, lgb_val], feval=lgb_f1_score,categorical_feature=['TYPE_NUMBER', 'PRODUCTGROUP_NAME'],verbose_eval=100, early_stopping_rounds = 100)oof[val_index] = clf.predict(X_val, num_iteration=clf.best_iteration)pred = clf.predict(X_val, num_iteration=clf.best_iteration)sc = f1_score(y_val, np.round(pred))f1_score2.append(sc)print(f'fold{i} f1 score = ',sc)print('best iteration = ',clf.best_iteration)fold_importance_df = pd.DataFrame()fold_importance_df["Feature"] = clf.feature_name()fold_importance_df["importance"] = clf.feature_importance()fold_importance_df["fold"] = i + 1feature_importance_df = pd.concat([feature_importance_df, fold_importance_df], axis=0)predictions2 += clf.predict(X_test, num_iteration=clf.best_iteration) / skf.n_splitsprint('val_11訓練f1均值:{},波動:{}.'.format(np.mean(f1_score2), np.std(f1_score2))) print('val_11 macro F1 score: ',f1_score(y_train, np.round(oof),average='macro'))

4. 特征重要性

plt.figure(figsize=(12,8)) sns.barplot(y='Feature', x='importance',data=feature_importance_df) plt.title('val_11特征重要性')

Text (0.5,1,'val_11特征重要性')

5. 生成 val_11 結果

sub2['label'] = predictions2 sub2['label'] = sub2['label'].rank() sub2['label'] = (sub2['label']>=sub2.shape[0] * 0.97).astype(int) sub2['label'] = (sub2['label'] + 1).astype(int) sub2.rename(columns={'Product_ID':'id'}, inplace=True) print('正負樣本比例:\n', sub2['label'].value_counts())

正負樣本比例:

1 3703?

2 81?

Name: label, dtype: int64

生成提交文件

sub = sub1.append(sub2) print('正負樣本比例:\n', sub['label'].value_counts()) sub.to_csv(f'sub_val4_{np.round(np.mean(f1_scores),3)}_val11_{np.round(np.mean(f1_score2),3)}.csv', index=False)

正負樣本比例:?

1 7312?

2 193?

Name: label, dtype: int64

sub.head()

由于文章篇幅限制,其他選手 Baseline 請掃碼查看。

▲?bestIteration版

▲?sijinabc版

▲?hh_neuq版

4

參賽方式

點擊閱讀原文鏈接或掃描下圖中的二維碼直達賽事頁面,注冊網站-下載數據,即可參賽。

biendata 是知名的國際性大數據競賽平臺,面向全球在校學生、科研人員、企業以及自由職業者開放,期待對人工智能感興趣的小伙伴能在平臺上眾多比賽中大展身手,在思維與技術的交流碰撞中激發創新和突破。?

友情提示,因涉及到數據下載,強烈建議大家登錄 PC 頁面報名參加。

5

INSPEC 工業檢測大數據

智源聯合博世發布了 INSPEC 工業檢測大數據,該數據集包括某系列產品近年來的質量檢測相關數據,其中主要為每個產品質量檢測環節各個步驟記錄的相關參數,每個步驟都標注檢測判定結果,整體數據量在 3w 條左右。相比于類似數據集,本比賽數據具有顯著優勢和特點。?

首先,該數據集來自世界頂尖制造企業真實的工廠生產數據,已經過脫敏處理,盡量還原現實環境中產品檢測的工序和流程。其次,INSPEC 工業檢測大數據詳細記錄了檢測環節生成的具體產品參數,涵蓋產品子家族 ID、實例 ID、檢測環節 ID、檢測環節結果、檢測規格和數值等。豐富的數據維度一方面增強了比賽的難度,另一方面有助于選手打造更加魯棒的模型。

6

智源算法大賽

2019 年 9 月,智源人工智能算法大賽正式啟動。本次比賽由北京智源人工智能研究院主辦,清華大學、北京大學、中科院計算所、曠視、知乎、博世、愛數智慧、國家天文臺、晶泰等協辦,總獎金超過 100 萬元,旨在以全球領先的科研數據集與算法競賽為平臺,選拔培育人工智能創新人才。?

研究院副院長劉江也表示:“我們希望不拘一格來支持人工智能真正的標志性突破,即使是本科生,如果真的是好苗子,我們也一定支持。”而人工智能大賽就是發現有潛力的年輕學者的重要途徑。?

本次智源人工智能算法大賽有兩個重要的目的,一是通過發布數據集和數據競賽的方式,推動基礎研究的進展。特別是可以讓計算機領域的學者參與到其它學科的基礎科學研究中。二是可以通過比賽篩選、鍛煉相關領域的人才。智源算法大賽已發布全部的 10 個數據集,目前仍有 5 個比賽(獎金 50 萬)尚未結束。

7

正在角逐的比賽

智源小分子化合物性質預測挑戰賽?

https://www.biendata.com/competition/molecule/?

智源杯天文數據算法挑戰賽?

https://www.biendata.com/competition/astrodata2019/

智源-INSPEC 工業大數據質量預測賽?

https://www.biendata.com/competition/bosch/

智源-MagicSpeechNet 家庭場景中文語音數據集挑戰賽

https://www.biendata.com/competition/magicdata/?

智源-高能對撞粒子分類挑戰賽?

https://www.biendata.com/competition/jet/

????

現在,在「知乎」也能找到我們了

進入知乎首頁搜索「PaperWeekly」

點擊「關注」訂閱我們的專欄吧

關于PaperWeekly

PaperWeekly 是一個推薦、解讀、討論、報道人工智能前沿論文成果的學術平臺。如果你研究或從事 AI 領域,歡迎在公眾號后臺點擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。

總結

以上是生活随笔為你收集整理的10万元奖金“智源工业检测赛”激战正酣!高分Baseline合辑带你入门智能制造的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。