数据挖掘:降低汽油精制过程中的辛烷值损失模型(二)
目錄
一、選取主要特征操作變量?
1.1問題分析
1.2 特征降維
1.2.1低方差濾波
1.2.2灰色關(guān)聯(lián)分析?
1.3 初步RFC模型
1.3.1 導(dǎo)入相關(guān)的數(shù)據(jù)庫
1.3.2 構(gòu)建初步隨機(jī)森林模型
1.3.3 GridSearch實現(xiàn)參數(shù)調(diào)優(yōu)
1.4 特征提取
1.4.1 獲取影響辛烷值的特征重要性
?1.4.2 可視化變量的重要性
一、選取主要特征操作變量?
1.1問題分析
汽油的實際精制生產(chǎn)工序十分繁瑣,可操作位點繁多,而不同操作位點之間可能存在著某些相關(guān)性質(zhì),例如裝置內(nèi)部溫度的變化可能會導(dǎo)致裝置內(nèi)部壓力的變化。同時也存在 一些與汽油成品質(zhì)量相關(guān)性不大的常規(guī)操作變量。為了降低后續(xù)數(shù)據(jù)處理過程中所消耗的計算資源,需要對354個操作變量進(jìn)行篩選,使得篩選出的操作變量最具代表性,與目標(biāo)輸出指標(biāo)的相關(guān)程度高。
數(shù)據(jù)來源:原始數(shù)據(jù)采集來源于中石化高橋石化實時數(shù)據(jù)庫(霍尼韋爾 PHD)及 LIMS 實驗數(shù)據(jù)庫。
問題要求:附件一中提供的 325 個樣本數(shù)據(jù)中,包括 7 個原料性質(zhì)、2 個待生吸附劑 性質(zhì)、2 個再生吸附劑性質(zhì)、2 個產(chǎn)品性質(zhì)等變量以及另外 354 個操作變量(共計 367 個 變量)。對上述 367 個變量進(jìn)行降維,選出不超過 30 個特征變量對模型進(jìn)行建模。要求 選擇具有代表性、獨立性。
目標(biāo):由于附件一中的 325 個樣本的原料性質(zhì)均有差異,故本文將樣本的 7 個原料性質(zhì)作為模型輸入的一部分,且對單個樣本進(jìn)行分析時原料性質(zhì)不可進(jìn)行操作更改。此外,本文將對 367 個操作變量進(jìn)行特征選擇,從中選擇 10 個對模型輸出影響較大的操作變量作為降維后的特征。綜上所述,本文對上述 367 個變量(其中預(yù)先確定選擇 7 個原料屬性變量)選擇合適的特征降維方法進(jìn)行降維后,得到共 17 個特征。
1.2 特征降維
http://t.csdn.cn/SJDJ6?12種降維方法終極指南
1.2.1低方差濾波
該方法假設(shè)數(shù)據(jù)列變化非常小的列包含的信息量少。因此,所有的數(shù)據(jù)列方差小的列被移除。需要注意的一點是:方差與數(shù)據(jù)范圍相關(guān)的,因此在采用該方法前需要對數(shù)據(jù)做歸一化處理。
example1:
1、初始化VarianceThreshfold,指定閥值方差
2、調(diào)用fit_transform
from sklearn.feature_selection import VarianceThresholdif __name__ == '__main__':data = [[1, 2, 3, 4, 5],[1, 7, 8, 9, 10],[1, 12, 13, 14, 15]]# 示例化一個轉(zhuǎn)化器類transfer = VarianceThreshold() # `threshold` 用默認(rèn)值 0# 調(diào)用 transfer.fit_transformdata_final = transfer.fit_transform(data)print('返回結(jié)果為:', data_final)''' 返回結(jié)果為: [[ 2 3 4 5][ 7 8 9 10][12 13 14 15]] ''' import numpy as np import pandas as pddata1=pd.read_excel('ques2.xlsx') #加載模塊 from sklearn.preprocessing import StandardScaler import warnings warnings.filterwarnings("ignore") #過濾掉警告的意思 from pyforest import * import pandas as pd import numpy as np from sklearn.preprocessing import MinMaxScaler #區(qū)間縮放,返回值為縮放到[0, 1]區(qū)間的數(shù)據(jù) Standard_data=MinMaxScaler().fit_transform(data1) #由于標(biāo)準(zhǔn)化后的數(shù)據(jù)是array格式,故將其轉(zhuǎn)化為數(shù)據(jù)框 Standard_data = pd.DataFrame(Standard_data) #轉(zhuǎn)為dataframe # 將文件寫入excel表格中 writer = pd.ExcelWriter('Standard_data_ques2.xlsx') #關(guān)鍵2,創(chuàng)建名稱為hhh的excel表格 Standard_data.to_excel(writer,'page_1',float_format='%.5f') #關(guān)鍵3,float_format 控制精度,將data_df寫到hhh表格的第一頁中。若多個文件,可以在page_2中寫入 writer.save() #關(guān)鍵4 S_data_ques2=pd.read_excel('Standard_data_ques2.xlsx') from sklearn.feature_selection import VarianceThreshold# 示例化一個轉(zhuǎn)化器類 transfer = VarianceThreshold() # `threshold` 用默認(rèn)值 0 # 調(diào)用 transfer.fit_transform data_final_1 = transfer.fit_transform(S_data_ques2) print('返回結(jié)果為:', data_final_1) data_df = pd.DataFrame(data_final_1) #關(guān)鍵1,將ndarray格式轉(zhuǎn)換為DataFrame # 將文件寫入excel表格中 writer = pd.ExcelWriter('new_ques2.xlsx') #關(guān)鍵2,創(chuàng)建名稱為hhh的excel表格 data_df.to_excel(writer,'page_1',float_format='%.5f') #關(guān)鍵3,float_format 控制精度,將data_df寫到hhh表格的第一頁中。若多個文件,可以在page_2中寫入 writer.save() #關(guān)鍵4處理之后的數(shù)據(jù)、變量縮減至211:
1.2.2灰色關(guān)聯(lián)分析?
對于兩個系統(tǒng)之間的因素,其隨時間或不同對象而變化的關(guān)聯(lián)性大小的量度,稱為關(guān)聯(lián)度。在系統(tǒng)發(fā)展過程中,若兩個因素變化的趨勢具有一致性,即同步變化程度較高,即可謂二者關(guān)聯(lián)程度較高;反之,則較低。因此,灰色關(guān)聯(lián)分析方法,是根據(jù)因素之間發(fā)展趨勢的相似或相異程度,亦即“灰色關(guān)聯(lián)度”,作為衡量因素間關(guān)聯(lián)程度的一種方法。
灰色系統(tǒng)理論提出了對各子系統(tǒng)進(jìn)行灰色關(guān)聯(lián)度分析的概念,意圖透過一定的方法,去尋求系統(tǒng)中各子系統(tǒng)(或因素)之間的數(shù)值關(guān)系。因此,灰色關(guān)聯(lián)度分析對于一個系統(tǒng)發(fā)展變化態(tài)勢提供了量化的度量,非常適合動態(tài)歷程分析。
計算步驟
1、確實參考數(shù)列與比較數(shù)列
2、對參考數(shù)列與比較數(shù)列進(jìn)行無量綱化處理
3、計算關(guān)聯(lián)系數(shù),求關(guān)聯(lián)度
import pandas as p import numpy as np from numpy import * import matplotlib.pyplot as plt %matplotlib inline# 從硬盤讀取數(shù)據(jù)進(jìn)入內(nèi)存 data_2=pd.read_excel('RFC.xlsx') data_2.head()這里要把變量RON放在最后一列。?
# 無量綱化 def dimensionlessProcessing(df):newDataFrame = pd.DataFrame(index=df.index)columns = df.columns.tolist()for c in columns:d = df[c]MAX = d.max()MIN = d.min()MEAN = d.mean()newDataFrame[c] = ((d - MEAN) / (MAX - MIN)).tolist()return newDataFramedef GRA_ONE(gray, m=0):# 讀取為df格式gray = dimensionlessProcessing(gray)# 標(biāo)準(zhǔn)化std = gray.iloc[:, m] # 為標(biāo)準(zhǔn)要素gray.drop(str(m),axis=1,inplace=True)ce = gray.iloc[:, 0:] # 為比較要素shape_n, shape_m = ce.shape[0], ce.shape[1] # 計算行列# 與標(biāo)準(zhǔn)要素比較,相減a = zeros([shape_m, shape_n])for i in range(shape_m):for j in range(shape_n):a[i, j] = abs(ce.iloc[j, i] - std[j])# 取出矩陣中最大值與最小值c, d = amax(a), amin(a)# 計算值result = zeros([shape_m, shape_n])for i in range(shape_m):for j in range(shape_n):result[i, j] = (d + 0.5 * c) / (a[i, j] + 0.5 * c)# 求均值,得到灰色關(guān)聯(lián)值,并返回result_list = [mean(result[i, :]) for i in range(shape_m)]result_list.insert(m,1)return pd.DataFrame(result_list)def GRA(DataFrame):df = DataFrame.copy()list_columns = [str(s) for s in range(len(df.columns)) if s not in [None]]df_local = pd.DataFrame(columns=list_columns)df.columns=list_columnsfor i in range(len(df.columns)):df_local.iloc[:, i] = GRA_ONE(df, m=i)[0]return df_local # 灰色關(guān)聯(lián)結(jié)果矩陣可視化import seaborn as snsdef ShowGRAHeatMap(DataFrame):colormap = plt.cm.RdBuylabels = DataFrame.columns.values.tolist()f, ax = plt.subplots(figsize=(14, 14))ax.set_title('GRA HeatMap')# 設(shè)置展示一半,如果不需要注釋掉mask即可mask = np.zeros_like(DataFrame)mask[np.triu_indices_from(mask)] = Truewith sns.axes_style("white"):sns.heatmap(DataFrame,cmap="YlGnBu",annot=True,mask=mask,)plt.show()data_2_gra = GRA(data_2) # 畫出熱力圖 ShowGRAHeatMap(data_2_gra)1.3 初步RFC模型
通過隨機(jī)森林(RFC)模型對汽油辛烷值RON進(jìn)行特征提取與模型優(yōu)化。
1.3.1 導(dǎo)入相關(guān)的數(shù)據(jù)庫
import matplotlib.pyplot as plt from sklearn.ensemble import RandomForestClassifier #隨機(jī)森林用于分類 from sklearn.ensemble import RandomForestRegressor #隨機(jī)森林用于回歸 from sklearn.model_selection import train_test_split #劃分訓(xùn)練集與測試集 from sklearn import metrics from sklearn.metrics import r2_score #用于模型擬合優(yōu)度評估 import numpy as np import pandas as pd #讀取數(shù)據(jù)這里,產(chǎn)品辛烷值RON作為數(shù)據(jù)標(biāo)簽,其余作為特征,由于特征過多,需要對對特征進(jìn)行降維提取。
#將數(shù)據(jù)分為訓(xùn)練和測試集 train_labels = df_2.iloc[:,0] #數(shù)據(jù)標(biāo)簽 train_features= df_2.iloc[:,1:] #數(shù)據(jù)特征 feature_list = list(train_features.columns) #數(shù)據(jù)特征名稱 train_features = np.array(train_features) #格式轉(zhuǎn)換 #劃分訓(xùn)練集與測試集 train_features, test_features, train_labels, test_labels = train_test_split(train_features, train_labels, test_size = 0.25, random_state = 42)1.3.2 構(gòu)建初步隨機(jī)森林模型
#構(gòu)造隨機(jī)森林模型 rf=RandomForestRegressor(n_estimators = 1000,oob_score = True,n_jobs = -1,random_state =42,max_features='auto',min_samples_leaf = 12) rf.fit(train_features,train_labels) #模型擬合 predictions= rf.predict(test_features) #預(yù)測 print("train r2:%.3f"%r2_score(train_labels,rf.predict(train_features))) #評估 print("test r2:%.3f"%r2_score(test_labels,predictions))初步構(gòu)造未提取特征之前的隨機(jī)森林模型,測試集與訓(xùn)練集結(jié)果展示如下:?
?可以看到,模型擬合訓(xùn)練集比測試集程度好,說明模型擬合程度待優(yōu)化,這里通過網(wǎng)格搜索方法實現(xiàn)模型參數(shù)的優(yōu)化。
1.3.3 GridSearch實現(xiàn)參數(shù)調(diào)優(yōu)
from sklearn.model_selection import GridSearchCV #GridSearch網(wǎng)格搜索 進(jìn)行參數(shù)調(diào)優(yōu) rfc=RandomForestRegressor() param = {"n_estimators": range(1,20),"min_samples_leaf": range(1,20)} #要調(diào)優(yōu)的參數(shù) gs = GridSearchCV(estimator=rfc,param_grid=param,cv=5) gs.fit(train_features,train_labels) #調(diào)優(yōu)擬合參數(shù)調(diào)優(yōu)后就是進(jìn)行模型最優(yōu)參數(shù)導(dǎo)出:
#導(dǎo)出調(diào)參后最優(yōu)參數(shù) best_score=gs.best_score_ best_params=gs.best_params_ print(best_score,best_params,end='\n')可以看到,模型擬合分?jǐn)?shù)為0.65,再次對模型進(jìn)行擬合查看參數(shù)調(diào)優(yōu)后的效果。?
#最優(yōu)參數(shù)再次進(jìn)行模型評估 rf=RandomForestRegressor(n_estimators = 14,oob_score = True,n_jobs = -1,random_state =42,max_features='auto',min_samples_leaf = 5) rf.fit(train_features,train_labels) predictions= rf.predict(test_features) print("train r2:%.3f"%r2_score(train_labels,rf.predict(train_features))) print("test r2:%.3f"%r2_score(test_labels,predictions))??可以看到,模型的訓(xùn)練集擬合優(yōu)度大幅度提升,測試集模型額擬合優(yōu)度也有明顯額提升,但幅度不大。
1.4 特征提取
1.4.1 獲取影響辛烷值的特征重要性
importances = list(rf.feature_importances_) #辛烷值RON影響因素的重要性 feature_importances = [(feature, round(importance, 2)) for feature, importance in zip(feature_list,importances)] #將相關(guān)變量名稱與重要性對應(yīng) feature_importances = sorted(feature_importances, key = lambda x: x[1], reverse = True) #排序 [print('Variable: {:12} Importance: {}'.format(*pair)) for pair in feature_importances] #輸出特征影響程度詳細(xì)數(shù)據(jù)?1.4.2 可視化變量的重要性
#繪圖 f,ax = plt.subplots(figsize = (13,8)) #設(shè)置圖片大小 x_values = list(range(len(importances))) plt.bar(x_values,importances, orientation = 'vertical', color = 'r',edgecolor = 'k',linewidth =0.2) #繪制柱形圖 # Tick labels for x axis plt.xticks(x_values, feature_list, rotation='vertical',fontsize=8) # Axis labels and title plt.ylabel('Importance'); plt.xlabel('Variable'); plt.title('Variable Importances'); # 以二維表格形式顯示 importances_df = pd.DataFrame() importances_df["特征名稱"]=feature_list importances_df["特征重要性"]=importances p=importances_df.sort_values("特征重要性",ascending=False)print(importances_df)?
?這里選擇15個特征變量,并最終作為辛烷值RON的特征。
總結(jié)
以上是生活随笔為你收集整理的数据挖掘:降低汽油精制过程中的辛烷值损失模型(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cad工具箱详细讲解_AutoCAD有哪
- 下一篇: 哈工大csapp-LAB3程序优化