這個單子讓我學到了一種處理特征的過程,如何進行特征的選擇
需求:最終項目報告應采用專業格式,內容應以提案為基礎。一份好的結案報告詳細介紹了項目提案的不同組成部分,作者的貢獻,以及未來可以做的工作。木星筆記本:它應該展示所有的步驟,你執行得到的結果。它可能包括但不限于: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()
Date | Time | CO(GT) | PT08.S1(CO) | NMHC(GT) | C6H6(GT) | PT08.S2(NMHC) | NOx(GT) | PT08.S3(NOx) | NO2(GT) | PT08.S4(NO2) | PT08.S5(O3) | T | RH | AH | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2004-03-10 | 18:00:00 | 2.6 | 1360.00 | 150 | 11.881723 | 1045.50 | 166.0 | 1056.25 | 113.0 | 1692.00 | 1267.50 | 13.60 | 48.875001 | 0.757754 |
1 | 2004-03-10 | 19:00:00 | 2.0 | 1292.25 | 112 | 9.397165 | 954.75 | 103.0 | 1173.75 | 92.0 | 1558.75 | 972.25 | 13.30 | 47.700000 | 0.725487 |
2 | 2004-03-10 | 20:00:00 | 2.2 | 1402.00 | 88 | 8.997817 | 939.25 | 131.0 | 1140.00 | 114.0 | 1554.50 | 1074.00 | 11.90 | 53.975000 | 0.750239 |
3 | 2004-03-10 | 21:00:00 | 2.2 | 1375.50 | 80 | 9.228796 | 948.25 | 172.0 | 1092.00 | 122.0 | 1583.75 | 1203.25 | 11.00 | 60.000000 | 0.786713 |
4 | 2004-03-10 | 22:00:00 | 1.6 | 1272.25 | 51 | 6.518224 | 835.50 | 131.0 | 1205.00 | 116.0 | 1490.00 | 1110.00 | 11.15 | 59.575001 | 0.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)
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 |
AH | 0.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]
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态