三國志戰略版 s6天梯圖,20191130_C6H6(GT)預測

 2023-12-09 阅读 18 评论 0

摘要:這個單子讓我學到了一種處理特征的過程,如何進行特征的選擇 需求:最終項目報告應采用專業格式,內容應以提案為基礎。一份好的結案報告詳細介紹了項目提案的不同組成部分,作者的貢獻,以及未來可以做的工作。木星筆記本:它應該展示所有的步驟࿰

這個單子讓我學到了一種處理特征的過程,如何進行特征的選擇
需求:最終項目報告應采用專業格式,內容應以提案為基礎。一份好的結案報告詳細介紹了項目提案的不同組成部分,作者的貢獻,以及未來可以做的工作。木星筆記本:它應該展示所有的步驟,你執行得到的結果。它可能包括但不限于:YouTube視頻。數據Descriptionw數據清洗和準備建模性能Evaluatione改進性能的步驟在您的圖形和結果的模型分析中顯示過擬合/非過擬合的證據。商務建議(根據你的分析,你的商務建議是什么?)如果你用R寫程序,你應該用木星筆記本顯示你的結果,并提交你的R文件。演示:在課堂上或通過YouTube視頻進行5-10分鐘的演示。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
import numpy as np
from sklearn.feature_selection import RFE
#進行數據的獲取
test=pd.read_excel('AirQualityUCI.xlsx')
#展示前5行
test.head()
DateTimeCO(GT)PT08.S1(CO)NMHC(GT)C6H6(GT)PT08.S2(NMHC)NOx(GT)PT08.S3(NOx)NO2(GT)PT08.S4(NO2)PT08.S5(O3)TRHAH
02004-03-1018:00:002.61360.0015011.8817231045.50166.01056.25113.01692.001267.5013.6048.8750010.757754
12004-03-1019:00:002.01292.251129.397165954.75103.01173.7592.01558.75972.2513.3047.7000000.725487
22004-03-1020:00:002.21402.00888.997817939.25131.01140.00114.01554.501074.0011.9053.9750000.750239
32004-03-1021:00:002.21375.50809.228796948.25172.01092.00122.01583.751203.2511.0060.0000000.786713
42004-03-1022:00:001.61272.25516.518224835.50131.01205.00116.01490.001110.0011.1559.5750010.788794
test=test.replace(-200,np.nan)
test.isnull().sum()
Date                0
Time                0
CO(GT)           1683
PT08.S1(CO)       366
NMHC(GT)         8443
C6H6(GT)          366
PT08.S2(NMHC)     366
NOx(GT)          1639
PT08.S3(NOx)      366
NO2(GT)          1642
PT08.S4(NO2)      366
PT08.S5(O3)       366
T                 366
RH                366
AH                366
dtype: int64
mean_cols=test.mean()
test = test.fillna(mean_cols)
test.isnull().sum()
Date             0
Time             0
CO(GT)           0
PT08.S1(CO)      0
NMHC(GT)         0
C6H6(GT)         0
PT08.S2(NMHC)    0
NOx(GT)          0
PT08.S3(NOx)     0
NO2(GT)          0
PT08.S4(NO2)     0
PT08.S5(O3)      0
T                0
RH               0
AH               0
dtype: int64
#使用皮爾遜相關性,不明白就百度下corr函數
plt.figure(figsize=(15,15))
cor = test.corr()
sns.heatmap(cor, annot=True, cmap=plt.cm.Reds)
plt.show()

在這里插入圖片描述
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-EBrPlehs-1575808765743)(output_6_0.png)]

#由于圖像中C6H6(GT)和其他變量相關性系數最高,所以提取C6H6(GT),并取相關性系數大于0.3的變量
features_cor =cor[abs(cor["C6H6(GT)"])>0.3]
#構建一個表,將相關性系數排列出來
features_cor = pd.DataFrame(features_cor["C6H6(GT)"])
#進行升序排列
features_cor.sort_values(by='C6H6(GT)')
C6H6(GT)
PT08.S3(NOx)-0.735711
NO2(GT)0.536178
NOx(GT)0.616880
PT08.S4(NO2)0.765717
CO(GT)0.812392
PT08.S5(O3)0.865727
PT08.S1(CO)0.883821
PT08.S2(NMHC)0.981962
C6H6(GT)1.000000
#觀察相關性,由于RH,T,AH相關性很高,所以比較他們三的關系,由結果知道,他們三可以用一個變量表示,所以只取AH
print(test[["AH","T"]].corr())
print(test[["RH","T"]].corr())
          AH         T
AH  1.000000  0.656471
T   0.656471  1.000000RH         T
RH  1.000000 -0.578569
T  -0.578569  1.000000

通過關系圖我們可以提取出最有關系的幾個變量為 自變量C6H6(GT) 因變量為 PT08.S1(CO) PT08.S2(NMHC) PT08.S3(NOx) PT08.S4(NO2) PT08.S5(O3),由于AH,T,HR的相關性很高,所以可以用一個自變量代替

df = test.loc[:,['PT08.S1(CO)','PT08.S2(NMHC)','PT08.S3(NOx)','PT08.S4(NO2)','PT08.S5(O3)','C6H6(GT)','AH']]
#查看他們的屬性類別
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 9357 entries, 0 to 9356
Data columns (total 7 columns):
PT08.S1(CO)      9357 non-null float64
PT08.S2(NMHC)    9357 non-null float64
PT08.S3(NOx)     9357 non-null float64
PT08.S4(NO2)     9357 non-null float64
PT08.S5(O3)      9357 non-null float64
C6H6(GT)         9357 non-null float64
AH               9357 non-null float64
dtypes: float64(7)
memory usage: 511.8 KB
#數據可視化
df.hist(figsize=(20,20))
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x0000029F96342E10>,<matplotlib.axes._subplots.AxesSubplot object at 0x0000029F9658C6A0>,<matplotlib.axes._subplots.AxesSubplot object at 0x0000029F97879D30>],[<matplotlib.axes._subplots.AxesSubplot object at 0x0000029F9788C400>,<matplotlib.axes._subplots.AxesSubplot object at 0x0000029F97ABAA90>,<matplotlib.axes._subplots.AxesSubplot object at 0x0000029F97ABAAC8>],[<matplotlib.axes._subplots.AxesSubplot object at 0x0000029F9762F7F0>,<matplotlib.axes._subplots.AxesSubplot object at 0x0000029F97659E80>,<matplotlib.axes._subplots.AxesSubplot object at 0x0000029F976C9550>]],dtype=object)

在這里插入圖片描述

三國志戰略版 s6天梯圖,[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-VnfprUF6-1575808765744)(output_12_1.png)]

#將原始數據劃分
from sklearn.model_selection import train_test_split
#刪除C6H6(GT)字段變為自變量
independent_vars=df.drop('C6H6(GT)',1)
#除了C6H6(GT)字段變為因變量
dependent_var=df['C6H6(GT)']
#調用函數train_test_split,三七劃分訓練集和測試集
x, x_holdout, y, y_holdout = train_test_split(independent_vars,dependent_var, test_size = 0.3, random_state = 0)
  1. 遞歸特征消除 (Recursive Feature Elimination)
      遞歸消除特征法使用一個基模型來進行多輪訓練,每輪訓練后,移除若干權值系數的特征,再基于新的特征集進行下一輪訓練。

sklearn官方解釋:對特征含有權重的預測模型(例如,線性模型對應參數coefficients),RFE通過遞歸減少考察的特征集規模來選擇特征。首先,預測模型在原始特征上訓練,每個特征指定一個權重。之后,那些擁有最小絕對值權重的特征被踢出特征集。如此往復遞歸,直至剩余的特征數量達到所需的特征數量。

RFECV 通過交叉驗證的方式執行RFE,以此來選擇最佳數量的特征:對于一個數量為d的feature的集合,他的所有的子集的個數是2的d次方減1(包含空集)。指定一個外部的學習算法,比如SVM之類的。通過該算法計算所有子集的validation error。選擇error最小的那個子集作為所挑選的特征。

from sklearn.svm import LinearSVR
#沒用變量加入,建立數組
nof_list=np.arange(1,7)
#記錄成績
high_score=0
#變量來存儲最優特征
nof=0           
score_list =[]
for n in range(len(nof_list)):x_train, x_test, y_train, y_test = train_test_split(x,y, test_size = 0.2, random_state = 1550)model = LinearSVR(C=0.3,loss='squared_epsilon_insensitive',max_iter=5000)# model= LinearSVR()#n_features_to_select為選擇的特征個數rfe = RFE(model,nof_list[n])x_train_rfe = rfe.fit_transform(x_train,y_train)x_test_rfe = rfe.transform(x_test)model.fit(x_train_rfe,y_train)score = model.score(x_test_rfe,y_test)score_list.append(score)if(score>high_score):high_score = scorenof = nof_list[n]
print("Optimum number of features: %d" %nof)
print("Score with %d features: %f" % (nof, high_score))
Optimum number of features: 2
Score with 2 features: 0.941529
cols = list(x.columns)
model = LinearSVR(C=0.3,loss='squared_epsilon_insensitive',max_iter=5000)
#初始化具有最優特征數的RFE模型
rfe = RFE(model,2)             
#轉換數據格式
x_rfe = rfe.fit_transform(x,y)  
#模型擬合
model.fit(x_rfe,y)              
temp = pd.Series(rfe.support_,index = cols)
selected_features_rfe = temp[temp==True].index
print(selected_features_rfe)
Index(['PT08.S2(NMHC)', 'AH'], dtype='object')
#建立selected_features_rfe數據,將最優特征選擇
selected_features_rfe=pd.DataFrame(selected_features_rfe,columns=['features'])
selected_features_rfe=pd.DataFrame(selected_features_rfe,index=selected_features_rfe['features'])

LassoCV:Lasso回歸可以使得一些特征的系數變小,甚至還使一些絕對值較小的系數直接變為0,從而增強模型的泛化能力

使用場景:對于高緯的特征數據,尤其是線性關系是稀疏的,就采用Lasso回歸,或者是要在一堆特征里面找出主要的特征,那么 Lasso回歸更是首選了

#使用svm算法進行模型預測
from sklearn.svm import SVR
from sklearn.linear_model import RidgeCV, LassoCV, Ridge, Lasso
lasso_model = LassoCV()
lasso_model.fit(x, y)
features_lasso = pd.DataFrame(lasso_model.coef_, index = x.columns,columns=['coef'])
features_lasso
coef
PT08.S1(CO)0.001811
PT08.S2(NMHC)0.028699
PT08.S3(NOx)0.004177
PT08.S4(NO2)-0.000184
PT08.S5(O3)0.000634
AH0.000000
#將特征選擇lasso大于0.4選擇
features_lasso=features_lasso[abs(features_lasso['coef'])>0.4]
features_lasso
coef
features_cor.index
Index(['CO(GT)', 'PT08.S1(CO)', 'C6H6(GT)', 'PT08.S2(NMHC)', 'NOx(GT)','PT08.S3(NOx)', 'NO2(GT)', 'PT08.S4(NO2)', 'PT08.S5(O3)'],dtype='object')
features_lasso.index
Index([], dtype='object')
selected_features_rfe.index
Index(['PT08.S2(NMHC)', 'AH'], dtype='object', name='features')
pd.Series(list(features_cor.index)+list(features_lasso.index)+list(selected_features_rfe.index))
0            CO(GT)
1       PT08.S1(CO)
2          C6H6(GT)
3     PT08.S2(NMHC)
4           NOx(GT)
5      PT08.S3(NOx)
6           NO2(GT)
7      PT08.S4(NO2)
8       PT08.S5(O3)
9     PT08.S2(NMHC)
10               AH
dtype: object
#去重之后進行合并特征
merged_features=pd.Series(list(features_cor.index)+list(features_lasso.index)+list(selected_features_rfe.index)).unique()
merged_features
array(['CO(GT)', 'PT08.S1(CO)', 'C6H6(GT)', 'PT08.S2(NMHC)', 'NOx(GT)','PT08.S3(NOx)', 'NO2(GT)', 'PT08.S4(NO2)', 'PT08.S5(O3)', 'AH'],dtype=object)
#通過邏輯回歸模型進行預測
from sklearn import linear_model
model =linear_model.LinearRegression()
model.fit(x_train,y_train)
#訓練集的結果
train_score = model.score(x_train, y_train)
#測試集的結果
test_score = model.score(x_test, y_test)
print('train score: {train_score:.6f}; test score: {test_score:.6f}'.format(train_score=train_score, test_score=test_score))
train score: 0.971132; test score: 0.971982
print(model.predict(x_test))
[ 4.24564562 12.24119766  4.72304685 ... 13.54784616  6.927730875.95113968]

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/193501.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息