蒸汽新人比賽程式碼,使用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))