数据挖掘:降低汽油精制过程中的辛烷值损失模型(二)
目錄
一、選取主要特征操作變量?
1.1問題分析
1.2 特征降維
1.2.1低方差濾波
1.2.2灰色關聯分析?
1.3 初步RFC模型
1.3.1 導入相關的數據庫
1.3.2 構建初步隨機森林模型
1.3.3 GridSearch實現參數調優
1.4 特征提取
1.4.1 獲取影響辛烷值的特征重要性
?1.4.2 可視化變量的重要性
一、選取主要特征操作變量?
1.1問題分析
汽油的實際精制生產工序十分繁瑣,可操作位點繁多,而不同操作位點之間可能存在著某些相關性質,例如裝置內部溫度的變化可能會導致裝置內部壓力的變化。同時也存在 一些與汽油成品質量相關性不大的常規操作變量。為了降低后續數據處理過程中所消耗的計算資源,需要對354個操作變量進行篩選,使得篩選出的操作變量最具代表性,與目標輸出指標的相關程度高。
數據來源:原始數據采集來源于中石化高橋石化實時數據庫(霍尼韋爾 PHD)及 LIMS 實驗數據庫。
問題要求:附件一中提供的 325 個樣本數據中,包括 7 個原料性質、2 個待生吸附劑 性質、2 個再生吸附劑性質、2 個產品性質等變量以及另外 354 個操作變量(共計 367 個 變量)。對上述 367 個變量進行降維,選出不超過 30 個特征變量對模型進行建模。要求 選擇具有代表性、獨立性。
目標:由于附件一中的 325 個樣本的原料性質均有差異,故本文將樣本的 7 個原料性質作為模型輸入的一部分,且對單個樣本進行分析時原料性質不可進行操作更改。此外,本文將對 367 個操作變量進行特征選擇,從中選擇 10 個對模型輸出影響較大的操作變量作為降維后的特征。綜上所述,本文對上述 367 個變量(其中預先確定選擇 7 個原料屬性變量)選擇合適的特征降維方法進行降維后,得到共 17 個特征。
1.2 特征降維
http://t.csdn.cn/SJDJ6?12種降維方法終極指南
1.2.1低方差濾波
該方法假設數據列變化非常小的列包含的信息量少。因此,所有的數據列方差小的列被移除。需要注意的一點是:方差與數據范圍相關的,因此在采用該方法前需要對數據做歸一化處理。
example1:
1、初始化VarianceThreshfold,指定閥值方差
2、調用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]]# 示例化一個轉化器類transfer = VarianceThreshold() # `threshold` 用默認值 0# 調用 transfer.fit_transformdata_final = transfer.fit_transform(data)print('返回結果為:', data_final)''' 返回結果為: [[ 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 #區間縮放,返回值為縮放到[0, 1]區間的數據 Standard_data=MinMaxScaler().fit_transform(data1) #由于標準化后的數據是array格式,故將其轉化為數據框 Standard_data = pd.DataFrame(Standard_data) #轉為dataframe # 將文件寫入excel表格中 writer = pd.ExcelWriter('Standard_data_ques2.xlsx') #關鍵2,創建名稱為hhh的excel表格 Standard_data.to_excel(writer,'page_1',float_format='%.5f') #關鍵3,float_format 控制精度,將data_df寫到hhh表格的第一頁中。若多個文件,可以在page_2中寫入 writer.save() #關鍵4 S_data_ques2=pd.read_excel('Standard_data_ques2.xlsx') from sklearn.feature_selection import VarianceThreshold# 示例化一個轉化器類 transfer = VarianceThreshold() # `threshold` 用默認值 0 # 調用 transfer.fit_transform data_final_1 = transfer.fit_transform(S_data_ques2) print('返回結果為:', data_final_1) data_df = pd.DataFrame(data_final_1) #關鍵1,將ndarray格式轉換為DataFrame # 將文件寫入excel表格中 writer = pd.ExcelWriter('new_ques2.xlsx') #關鍵2,創建名稱為hhh的excel表格 data_df.to_excel(writer,'page_1',float_format='%.5f') #關鍵3,float_format 控制精度,將data_df寫到hhh表格的第一頁中。若多個文件,可以在page_2中寫入 writer.save() #關鍵4處理之后的數據、變量縮減至211:
1.2.2灰色關聯分析?
對于兩個系統之間的因素,其隨時間或不同對象而變化的關聯性大小的量度,稱為關聯度。在系統發展過程中,若兩個因素變化的趨勢具有一致性,即同步變化程度較高,即可謂二者關聯程度較高;反之,則較低。因此,灰色關聯分析方法,是根據因素之間發展趨勢的相似或相異程度,亦即“灰色關聯度”,作為衡量因素間關聯程度的一種方法。
灰色系統理論提出了對各子系統進行灰色關聯度分析的概念,意圖透過一定的方法,去尋求系統中各子系統(或因素)之間的數值關系。因此,灰色關聯度分析對于一個系統發展變化態勢提供了量化的度量,非常適合動態歷程分析。
計算步驟
1、確實參考數列與比較數列
2、對參考數列與比較數列進行無量綱化處理
3、計算關聯系數,求關聯度
import pandas as p import numpy as np from numpy import * import matplotlib.pyplot as plt %matplotlib inline# 從硬盤讀取數據進入內存 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)# 標準化std = gray.iloc[:, m] # 為標準要素gray.drop(str(m),axis=1,inplace=True)ce = gray.iloc[:, 0:] # 為比較要素shape_n, shape_m = ce.shape[0], ce.shape[1] # 計算行列# 與標準要素比較,相減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)# 求均值,得到灰色關聯值,并返回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 # 灰色關聯結果矩陣可視化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')# 設置展示一半,如果不需要注釋掉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模型
通過隨機森林(RFC)模型對汽油辛烷值RON進行特征提取與模型優化。
1.3.1 導入相關的數據庫
import matplotlib.pyplot as plt from sklearn.ensemble import RandomForestClassifier #隨機森林用于分類 from sklearn.ensemble import RandomForestRegressor #隨機森林用于回歸 from sklearn.model_selection import train_test_split #劃分訓練集與測試集 from sklearn import metrics from sklearn.metrics import r2_score #用于模型擬合優度評估 import numpy as np import pandas as pd #讀取數據這里,產品辛烷值RON作為數據標簽,其余作為特征,由于特征過多,需要對對特征進行降維提取。
#將數據分為訓練和測試集 train_labels = df_2.iloc[:,0] #數據標簽 train_features= df_2.iloc[:,1:] #數據特征 feature_list = list(train_features.columns) #數據特征名稱 train_features = np.array(train_features) #格式轉換 #劃分訓練集與測試集 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 構建初步隨機森林模型
#構造隨機森林模型 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) #預測 print("train r2:%.3f"%r2_score(train_labels,rf.predict(train_features))) #評估 print("test r2:%.3f"%r2_score(test_labels,predictions))初步構造未提取特征之前的隨機森林模型,測試集與訓練集結果展示如下:?
?可以看到,模型擬合訓練集比測試集程度好,說明模型擬合程度待優化,這里通過網格搜索方法實現模型參數的優化。
1.3.3 GridSearch實現參數調優
from sklearn.model_selection import GridSearchCV #GridSearch網格搜索 進行參數調優 rfc=RandomForestRegressor() param = {"n_estimators": range(1,20),"min_samples_leaf": range(1,20)} #要調優的參數 gs = GridSearchCV(estimator=rfc,param_grid=param,cv=5) gs.fit(train_features,train_labels) #調優擬合參數調優后就是進行模型最優參數導出:
#導出調參后最優參數 best_score=gs.best_score_ best_params=gs.best_params_ print(best_score,best_params,end='\n')可以看到,模型擬合分數為0.65,再次對模型進行擬合查看參數調優后的效果。?
#最優參數再次進行模型評估 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))??可以看到,模型的訓練集擬合優度大幅度提升,測試集模型額擬合優度也有明顯額提升,但幅度不大。
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)] #將相關變量名稱與重要性對應 feature_importances = sorted(feature_importances, key = lambda x: x[1], reverse = True) #排序 [print('Variable: {:12} Importance: {}'.format(*pair)) for pair in feature_importances] #輸出特征影響程度詳細數據?1.4.2 可視化變量的重要性
#繪圖 f,ax = plt.subplots(figsize = (13,8)) #設置圖片大小 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的特征。
總結
以上是生活随笔為你收集整理的数据挖掘:降低汽油精制过程中的辛烷值损失模型(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cad工具箱详细讲解_AutoCAD有哪
- 下一篇: 哈工大csapp-LAB3程序优化