您好,登錄后才能下訂單哦!
這篇文章主要講解了“python怎么找出數(shù)據(jù)相關(guān)性”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“python怎么找出數(shù)據(jù)相關(guān)性”吧!
首先,我們需要討論競(jìng)賽本身。DengAI的目標(biāo)是(目前是,因?yàn)镈riventa管理局決定將其設(shè)為“持續(xù)的”比賽,因此你可以現(xiàn)在加入)根據(jù)天氣數(shù)據(jù)和地點(diǎn)預(yù)測(cè)特定一周的登革熱病例數(shù)。
每個(gè)參與者都得到了一個(gè)訓(xùn)練數(shù)據(jù)集和測(cè)試數(shù)據(jù)集(不是驗(yàn)證數(shù)據(jù)集)。MAE(平均絕對(duì)誤差)是一種用于計(jì)算分?jǐn)?shù)的指標(biāo),訓(xùn)練數(shù)據(jù)集涵蓋了2個(gè)城市(1456周)28年的每周的數(shù)值。測(cè)試數(shù)據(jù)較小,有跨越5年和3年的(這取決于城市)。
登革熱是一種蚊子傳播的疾病,發(fā)生在世界熱帶和亞熱帶地區(qū)。因?yàn)樗怯晌米訑y帶的,該疾病的傳播與氣候、天氣變化有關(guān)。
如果我們看一下訓(xùn)練數(shù)據(jù)集,它有多個(gè)特征:
城市和日期指標(biāo):
city :sj代表San Juan(圣胡安),iq代表Iquitos
week_start_date -以yyyy-mm-dd格式給出的日期
NOAA的GHCN每日氣候數(shù)據(jù)氣象站測(cè)量:
station_max_temp_c-最高溫度
station_min_temp_c-最低溫度
station_avg_temp_c-平均溫度
station_precip_mm-總降水量
station_diur_temp_rng_c-晝間溫度范圍
衛(wèi)星降水測(cè)量(0.25x0.25度的標(biāo)度):
precipitation_amt_mm-總降水量
NOAA的NCEP氣候預(yù)報(bào)系統(tǒng)分析測(cè)量(0.5x0.5度的標(biāo)度):
reanalysis_sat_precip_amt_mm-總降水量
reanalysis_dew_point_temp_k-平均露點(diǎn)溫度
reanalysis_air_temp_k-平均氣溫
reanalysis_relative_humidity_percent-平均相對(duì)濕度
reanalysis_specific_humidity_g_per_kg-平均特定濕度
reanalysis_precip_amt_kg_per_m2-總降水量
reanalysis_max_air_temp_k=最大空氣溫度
reanalysis_min_air_temp_k-最低空氣溫度
reanalysis_avg_temp_k-平均氣溫
reanalysis_tdtr_k-白天溫度范圍
NOAA的CDR歸一化差異植被指數(shù)(NDVI)(0.5x0.5度的標(biāo)度):
ndvi_se-城市質(zhì)心東南的NVDI
ndvi_sw-城市質(zhì)心西南的NVDI
ndvi_ne-城市質(zhì)心東北的NVDI
ndvi_nw-城市中心西北的NVDI
此外,我們還有每周總病例數(shù)的信息。
很容易發(fā)現(xiàn),對(duì)于數(shù)據(jù)集中的每一行,我們都有多個(gè)描述類似數(shù)據(jù)的特征。有四類:
溫度
降水
濕度
ndvi(這四個(gè)特征指的是城市的不同點(diǎn),因此它們不是完全相同的數(shù)據(jù))
因此,我們應(yīng)該能夠從輸入中刪除一些冗余數(shù)據(jù)。
week_start_date 1994-05-07 total_cases 22 station_max_temp_c 33.3 station_avg_temp_c 27.7571428571 station_precip_mm 10.5 station_min_temp_c 22.8 station_diur_temp_rng_c 7.7 precipitation_amt_mm 68.0 reanalysis_sat_precip_amt_mm 68.0 reanalysis_dew_point_temp_k 295.235714286 reanalysis_air_temp_k 298.927142857 reanalysis_relative_humidity_percent 80.3528571429 reanalysis_specific_humidity_g_per_kg 16.6214285714 reanalysis_precip_amt_kg_per_m2 14.1 reanalysis_max_air_temp_k 301.1 reanalysis_min_air_temp_k 297.0 reanalysis_avg_temp_k 299.092857143 reanalysis_tdtr_k 2.67142857143 ndvi_location_1 0.1644143 ndvi_location_2 0.0652 ndvi_location_3 0.1321429 ndvi_location_4 0.08175
city,year,weekofyear,total_cases sj,1990,18,4 sj,1990,19,5 ...
在開始設(shè)計(jì)模型之前,我們需要查看原始數(shù)據(jù)并加以修正。為了達(dá)到這個(gè)目的,我們將使用pandas庫(kù)。通常,我們可以直接導(dǎo)入.csv文件并處理導(dǎo)入的數(shù)據(jù)幀,但有時(shí)(特別是當(dāng)?shù)谝恍袥]有列描述時(shí)),我們必須提供列列表。
import pandas as pd pd.set_option("display.precision", 2) df = pd.read_csv('./dengue_features_train_with_out.csv') df.describe()
Pandas有一個(gè)名為describe的內(nèi)置方法,它顯示數(shù)據(jù)集中列的基本統(tǒng)計(jì)信息。
當(dāng)然,這種方法只適用于數(shù)值數(shù)據(jù)。如果我們有非數(shù)值列,我們必須先做一些預(yù)處理。在我們的例子中,唯一的列是city。這個(gè)列只包含sj和iq兩個(gè)值,我們稍后將處理它。
回到主表。每行包含不同類型的信息:
count -描述非NaN值的個(gè)數(shù)
mean -整列的平均值(用于標(biāo)準(zhǔn)化)
std -標(biāo)準(zhǔn)差(也可用于標(biāo)準(zhǔn)化)
min ->max -顯示包含值的范圍(用于縮放)
讓我們從計(jì)數(shù)開始。知道數(shù)據(jù)集中有多少條記錄丟失了(一個(gè)或多個(gè))并決定如何處理這些數(shù)據(jù)是很重要的。如果你看ndvi_nw值,它在13.3%的情況下是空的。如果你決定用諸如0之類的任意值替換缺少的值,這可能是個(gè)性能問題。通常,有兩種常見的解決方案:
設(shè)置平均值
插值法
當(dāng)處理序列數(shù)據(jù)時(shí)(就像我們這個(gè)場(chǎng)景一樣),從它的鄰域中插值(僅從鄰域中取平均值)值,而不是用整個(gè)集合中的平均值來(lái)代替它,這樣比較合理。
通常,序列數(shù)據(jù)在序列中的值之間有一定的相關(guān)性,使用鄰域可以得到更好的結(jié)果。我給你舉個(gè)例子。
假設(shè)你正在處理溫度數(shù)據(jù),并且你的整個(gè)數(shù)據(jù)集由一月到十二月的值組成。全年的平均值將是一年中大部分時(shí)間缺失天數(shù)的無(wú)效替代值。
如果從7月開始計(jì)算,則可能會(huì)有[28,27,-,-,30]。如果在倫敦的話,年平均氣溫是11攝氏度(或52華氏度)。在這種情況下使用11作為溫度填充就是錯(cuò)誤的。這就是為什么我們應(yīng)該使用插值而不是平均值。
有了插值(即使在有更大差距的情況下),我們應(yīng)該能夠獲得更好的結(jié)果。如果你計(jì)算這些值,你應(yīng)該得到(27+30)/2=28.5和(28.5+30)/2=29.25,所以最終我們的數(shù)據(jù)集看起來(lái)像是[28,27,28.5,29.25,30],遠(yuǎn)遠(yuǎn)好于[28,27,11,11,30]。
將數(shù)據(jù)集拆分為城市
因?yàn)槲覀円呀?jīng)討論了一些重要的事情,所以我們可以定義一種方法,該方法允許我們將分類列(city)重新定義為二進(jìn)制列向量并對(duì)數(shù)據(jù)進(jìn)行插值:
def extract_data(train_file_path, columns, categorical_columns=CATEGORICAL_COLUMNS, categories_desc=CATEGORIES, interpolate=True): # 讀取csv文件并返回 all_data = pd.read_csv(train_file_path, usecols=columns) if categorical_columns is not None: # 將分類映射到列 for feature_name in categorical_columns: mapping_dict = {categories_desc[feature_name][i]: categories_desc[feature_name][i] for i in range(0, len(categories_desc[feature_name]))} all_data[feature_name] = all_data[feature_name].map(mapping_dict) # 將映射的分類數(shù)據(jù)更改為0/1列 all_data = pd.get_dummies(all_data, prefix='', prefix_sep='') # 修復(fù)丟失的數(shù)據(jù) if interpolate: all_data = all_data.interpolate(method='linear', limit_direction='forward') return all_data
此函數(shù)返回一個(gè)數(shù)據(jù)集,其中包含兩個(gè)名為sj和iq的二進(jìn)制列,它們具有布爾值,其中city被設(shè)置為sj或iq。
繪制數(shù)據(jù)圖以直觀地了解值在序列中的分布是很重要的。我們將使用一個(gè)名為Seaborn的庫(kù)來(lái)幫助我們繪制數(shù)據(jù)。
sns.pairplot(dataset[["precipitation_amt_mm", "reanalysis_sat_precip_amt_mm", "station_precip_mm"]], diag_kind="kde")
這里我們只有一個(gè)數(shù)據(jù)集的特征,我們可以清楚地區(qū)分季節(jié)和城市(平均值從~297下降到~292)。
另一件有用的事情是不同特征之間的關(guān)聯(lián)。這樣我們就可以從數(shù)據(jù)集中刪除一些冗余的特征。
正如你所注意到的,我們可以立即刪除其中一個(gè)降水特征。一開始這可能是無(wú)意的,但因?yàn)槲覀冇衼?lái)自不同來(lái)源的數(shù)據(jù),同一類數(shù)據(jù)(如降水量)并不總是完全相關(guān)的。這可能是由于不同的測(cè)量方法或其他原因造成的。
當(dāng)我們使用很多特征時(shí),我們不需要為每一對(duì)都繪制成對(duì)圖。另一個(gè)選擇就是計(jì)算所謂的相關(guān)性分?jǐn)?shù)。不同類型的數(shù)據(jù)有不同類型的相關(guān)性。我們使用corr()的方法生成數(shù)據(jù)集的數(shù)值相關(guān)性。
如果有不應(yīng)該被視為二進(jìn)制的分類列,你可以計(jì)算Cramer的V關(guān)聯(lián)度量來(lái)找出它們和其他數(shù)據(jù)之間的“相關(guān)性”。
import pandas as pd import seaborn as sns # 導(dǎo)入我們的提取函數(shù) from helpers import extract_data from data_info import * train_data = extract_data(train_file, CSV_COLUMNS) # 獲取“sj”city的數(shù)據(jù)并刪除兩個(gè)二進(jìn)制列 sj_train = train_data[train_data['sj'] == 1].drop(['sj', 'iq'], axis=1) # 生成熱圖 corr = sj_train.corr() mask = np.triu(np.ones_like(corr, dtype=np.bool)) plt.figure(figsize=(20, 10)) ax = sns.heatmap( corr, mask=mask, vmin=-1, vmax=1, center=0, cmap=sns.diverging_palette(20, 220, n=200), square=True ) ax.set_title('Data correlation for city "sj"') ax.set_xticklabels( ax.get_xticklabels(), rotation=45, horizontalalignment='right' );
你可以對(duì)iq 城做同樣的事情,并將兩者進(jìn)行比較(相關(guān)性是不同的)。
如果你看看這張熱圖,很明顯可以看出哪些特征相互關(guān)聯(lián),哪些不相關(guān)。你應(yīng)該知道有正相關(guān)和負(fù)相關(guān)(深藍(lán)色和深紅色)。沒有相關(guān)性的特征是白色的。
有幾組正相關(guān)的特征,毫不奇怪,它們指的是同一類型的測(cè)量(例如station_min_temp_c和station_avg_temp_c之間的相關(guān)性)。但在不同的特征之間也存在相關(guān)性(比如reanalysis_specific_humidity_g_per_kg和reanalysis_dew_point_temp_k)。我們還應(yīng)該關(guān)注total_cases和其他特征之間的相關(guān)性,因?yàn)檫@是我們需要預(yù)測(cè)的。
這次我們走運(yùn)了,因?yàn)闆]有什么東西和我們的目標(biāo)有很強(qiáng)的相關(guān)性。但是我們?nèi)匀粦?yīng)該能夠?yàn)槲覀兊哪P瓦x擇最重要的特征?,F(xiàn)在看熱圖沒什么用,讓我切換到條形圖。
sorted_y = corr.sort_values(by='total_cases', axis=0).drop('total_cases') plt.figure(figsize=(20, 10)) ax = sns.barplot(x=sorted_y.total_cases, y=sorted_y.index, color="b") ax.set_title('Correlation with total_cases in "sj"')
通常,在為模型選擇特征時(shí),我們選擇的特征與目標(biāo)的絕對(duì)相關(guān)值最高。這取決于你決定你選擇多少特征,你甚至可以選擇所有的特征,但這通常不是最好的主意。
觀察目標(biāo)值在數(shù)據(jù)集中是如何分布的也是很重要的。我們可以很容易地用pandas做到:
平均一周的病例數(shù)相當(dāng)少。只是偶爾(一年一次),案件總數(shù)會(huì)跳到某個(gè)更高的數(shù)值。在設(shè)計(jì)我們的模型時(shí),我們需要記住這一點(diǎn),因?yàn)榧词刮覀冊(cè)O(shè)法找到了“跳躍”,我們可能會(huì)在幾周內(nèi)得分損失慘重,因?yàn)樘S這種情況幾乎沒有樣本。
本文最后要討論的是NDVI指數(shù)(歸一化差異植被指數(shù))。這個(gè)指數(shù)是植被的指標(biāo)。高負(fù)值對(duì)應(yīng)于水,接近0的值表示巖石/沙子/雪,值接近1熱帶森林。在給定的數(shù)據(jù)集中,每個(gè)城市有4個(gè)不同的NDVI值(每個(gè)值對(duì)應(yīng)于地圖上不同的角落)。
即使總體NDVI指數(shù)對(duì)于了解我們正在處理的地形類型非常有用。如果我們需要為多個(gè)城市設(shè)計(jì)一個(gè)模型,地形類型的特征可能會(huì)很有用,但在這種情況下,我們只已知兩個(gè)城市的氣候和位置。我們不需要訓(xùn)練我們的模型來(lái)判斷我們所處的環(huán)境,相反,我們可以為每個(gè)城市訓(xùn)練不同的模型。
我花了一段時(shí)間嘗試使用這些值(尤其是在這種情況下插值很困難,因?yàn)槲覀冊(cè)谶@個(gè)過程中使用了大量的信息)。使用NDVI指數(shù)也可能產(chǎn)生誤導(dǎo),因?yàn)閿?shù)值的變化并不一定與植被過程的變化相對(duì)應(yīng)。
感謝各位的閱讀,以上就是“python怎么找出數(shù)據(jù)相關(guān)性”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)python怎么找出數(shù)據(jù)相關(guān)性這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。