1. 程式人生 > >蒸汽新人比賽程式碼,使用LGB(學習)

蒸汽新人比賽程式碼,使用LGB(學習)

 

這是第一次寫資料探勘的學習筆記

 

該類部落格的初衷:

經歷實驗室專案的初體驗,做的是資料預處理、特徵工程之類的事情。自己還是一個菜鳥,什麼都不會也不太明白,做起來很盲目無從下手,最終的結果也是不理想。不得不自己想點辦法,看到自己的不足需要學習很多資料探勘和機器學習的知識。為了以後再做實驗室專案不那麼慌張,為了對得起學術型研究生這個稱號,:中鴨!!

 

賽題背景

火力發電的基本原理是:燃料在燃燒時加熱水生成蒸汽,蒸汽壓力推動汽輪機旋轉,然後汽輪機帶動發電機旋轉,產生電能。在這一系列的能量轉化中,影響發電效率的核心是鍋爐的燃燒效率,即燃料燃燒加熱水產生高溫高壓蒸汽。鍋爐的燃燒效率的影響因素很多,包括鍋爐的可調引數,如燃燒給量,一二次風,引風,返料風,給水水量;以及鍋爐的工況,比如鍋爐床溫、床壓,爐膛溫度、壓力,過熱器的溫度等。

賽題描述

經脫敏後的鍋爐感測器採集的資料(採集頻率是分鐘級別),根據鍋爐的工況,預測產生的蒸汽量。

 

原始碼地址:https://tianchi.aliyun.com/notebook/detail.html?spm=5176.11409386.0.0.60a51d070HoVWk&id=36153

 

特徵處理方式:

交叉特徵,即簡單的成對互動特徵是兩個特徵的積。類似邏輯與。這使我們能夠捕獲特徵之間的相互影響,因此它們被稱為互動特徵。構造互動特徵非常簡單,但它們使用起來很昂貴。使用成對互動特徵的線性模型的訓練和得分時間將從O(n)到O(n2),其中n是單身特徵的數量。

本次實驗特徵不算很多,一共現有38個特徵,可以選擇所有的特徵進行成對互動。

對於大數量的特徵,可以在所有互動特徵之上執行特徵選擇,選擇前幾個。或者可以更仔細地製作更少數量的複雜特徵。

 

1. 首先是匯入資料,並新增標籤

# 匯入資料
zhengqi_train = pd.read_table('./zhengqi_train.txt',encoding='utf-8')
zhengqi_test = pd.read_table('./zhengqi_test.txt',encoding='utf-8')

#新增label
zhengqi_train["label"] = 1
zhengqi_train['label'] = zhengqi_train['label'].apply(lambda x:int(x))

2. 採用交叉特徵方式新增特徵,交叉的方式只是單純的求和。

#新增特徵
#這裡做了一個簡單特徵擴充套件,讓現有38個特徵互相疊加。每個特徵和其他37個特徵直接相加
items = []
for i in range(38):
    v = 'V'+str(i)
    items.append(v)
# print(items)
 
for i in range(len(items)):
    for j in range(i+1,len(items)):
        temp = zhengqi_train[items[i]]+zhengqi_train[items[j]]
        zhengqi_train[items[i]+'_'+items[j]] = temp
zhengqi_train_ = zhengqi_train.drop(items,axis = 1)

3. 未降維的資料劃分,分為輸入資料和輸出資料。

# 資料分割
X = np.array(zhengqi_train.drop(['target'], axis = 1))
y = np.array(zhengqi_train.target)
 
print('================================')
print(X.shape)
print(y.shape)
print('================================')
 
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
print(len(X_train))
print(len(X_test))

4. 資料降維,防止過擬合。

採用隨機森林迴歸,基於樹的三種整合迴歸模型RandomForestRegressor,ExtraTreesRegressor以及GradientBoostingRegressor。

參考資料:https://blog.csdn.net/jiede1/article/details/78245597/

普通的隨機森林模型構建的分裂節點時是隨機選取特徵的,極端隨機森林構建每一棵樹的分裂節點時,不會任意的選取特徵,而是先隨機收集一部分特徵,然後利用資訊熵/基尼指數挑選最佳的節點特徵

# 資料降維
# 現在資料有700多個特徵太多了會過擬合,需要降維
# 使用的預設引數,後面要調參
X.shape
clf = ExtraTreesRegressor()
clf = clf.fit(X, y)
 
model = SelectFromModel(clf, prefit=True,)
X_new = model.transform(X)
X_new.shape

5. 資料降維後的資料劃分,進行 lightGBM調參。

# 資料劃分
X_train_new, X_test_new, y_train, y_test = train_test_split(X_new, y, test_size=0.3, random_state=0)
 
params = {
    'boosting_type': 'gbdt',
    'objective': 'regression',
    'metric': 'mse',
    'num_leaves': 32,
    'learning_rate': 0.05,
    'feature_fraction': 0.9,
    'bagging_fraction': 0.8,
    'bagging_freq': 5,
    'verbose': 1
}

6. 使用LightGBM進行訓練,學習地址:http://lightgbm.apachecn.org/cn/latest/index.html

# 使用LightGBM
xx_submit = []
lgb_train = lgb.Dataset(X_train_new, y_train)
gbm = lgb.train(params,
                lgb_train,
                num_boost_round=5000,
                verbose_eval=50,
                )
xx_submit.append(gbm.predict(X_test_new, num_iteration=gbm.best_iteration))