<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          使用時間特征使讓機器學(xué)習(xí)模型更好地工作

          共 4805字,需瀏覽 10分鐘

           ·

          2022-02-15 20:04

          來源?DeepHub IMBA

          本文2300字,建議閱讀8分鐘

          在本文中,通過一個實際示例討論如何從 DateTime 變量中提取新特征以提高機器學(xué)習(xí)模型的準(zhǔn)確性。


          特征工程是構(gòu)建機器學(xué)習(xí)模型最重要的方面之一。在本文中,我將通過一個實際示例討論如何從 DateTime 變量中提取新特征以提高機器學(xué)習(xí)模型的準(zhǔn)確性。

          從日期中提取特征


          一些數(shù)據(jù)集提供了日期或日期時間字段,通常在為機器學(xué)習(xí)模型構(gòu)建輸入特征時會被刪除(除非您正在處理時間序列,顯然 ??)。

          但是,DateTime 是可用于提取新特征的,這些新特征可以添加到數(shù)據(jù)集的其他可用特征中。

          日期由日、月和年組成。從這三個部分中,至少可以提取四個不同的特征:

          • 一年中的一天或一個月中的一天或一周中的一天

          • 一年中的月份

          • 季節(jié)


          除了年以外,所有的特征都可以兩部分:正弦和余弦,這樣可以獲得時間的周期性,例如 1 月 1 日接近 12 月 31 日。

          一年中的一天或一個月中的一天或一周中的一天

          一年中的某一天是指 1 到 365(或 366)之間的數(shù)字。當(dāng)你有一個粒度精細的數(shù)據(jù)集并且在天數(shù)內(nèi)具有平衡分布時可以使用這個特征,否則使用此特征可能會產(chǎn)生過擬合。

          在 Python 中,一年中的某一天可以計算如下:

          import numpy as np
          current_date = "2022-01-25 17:21:22"
          cdate = datetime.strptime(current_date, '%Y-%m-%d %H:%M:%S')

          day_sin = np.sin(2 * np.pi * cdate.timetuple().tm_yday/365.0)
          day_cos = np.cos(2 * np.pi * cdate.timetuple().tm_yday/365.0)

          對于數(shù)據(jù)集中更稀疏的日期值,建議將日期用作月份或星期幾。

          一年中的月份

          一年中的月份指的是 1 到 12 之間的數(shù)字。如果 DF中有 DateTime 列,則可以按如下方式提取一年中的月份:

          df['month_sin'] = np.sin(2 * np.pi * df['date_time'].dt.month/12.0)
          df['month_cos'] = np.cos(2 * np.pi * df['date_time'].dt.month/12.0)

          季節(jié)

          季節(jié)是一個分類變量,包括以下值:春季、夏季、秋季和冬季。

          在 Python 中,可以按照 Stackoverflow 上這個有趣的回復(fù)中的說明提取季節(jié)。(https://stackoverflow.com/questions/16139306/determine-season-given-timestamp-in-python-using-datetime)

          或者可以將季節(jié)視為數(shù)字特征。


          當(dāng)必須預(yù)測未來的值時,年份作為輸入特征并不是很有用。但是為了完整起見本篇文章還是將描述如何將其作為輸入特征加以利用。

          如果數(shù)據(jù)集包含多年,則可以使用年份。它可以是分類變量或數(shù)值變量,具體取決于需求。

          如果 Pandas 有 DateTime 列,則可以按如下方式提取年份:

          df['year'] = df['date_time'].dt.year


          從時間中提取特征


          根據(jù)數(shù)據(jù)集的粒度,可以從 DateTime 列中提取不同級別的時間特征(小時、分鐘、秒……)。但是,最頻繁的時間特征是以小時為單位。時間特征應(yīng)分割為正弦和余弦以反映數(shù)據(jù)循環(huán)性(例如 23:59 接近 0:01)。

          在 Python 中,給定一個 DateTime 變量,可以按如下方式提取一個小時:

          hour_sin = np.sin(2 * np.pi * cdate.hour/24.0)
          hour_cos = np.cos(2 * np.pi * cdate.hour/24.0)


          一個實際的例子


          該示例利用了 Kaggle 上的天氣數(shù)據(jù)集,該數(shù)據(jù)集在 CC0:公共領(lǐng)域許可證下。

          此示例的目的是構(gòu)建一個多類分類器,該分類器根據(jù)輸入特征預(yù)測天氣狀況(由數(shù)據(jù)集的摘要列給出)。我計算了兩種情況的準(zhǔn)確性:有和沒有 DateTime特征。

          加載數(shù)據(jù)集

          該數(shù)據(jù)集可在 Kaggle 上獲得。并且通過 Pandas加載:

          import pandas as pd
          df = pd.read_csv('../input/weather-dataset/weatherHistory.csv')


          該數(shù)據(jù)集包含 96,453 條記錄和 12 列。

          探索性數(shù)據(jù)分析

          現(xiàn)在,我刪除了對預(yù)測沒有太大影響的變量。所有行的 Loud Cover 都是相同的,所以也可以刪除它。

          df['Loud Cover'].value_counts()
          0.0 ? 96453
          Name: Loud Cover, dtype: int64

          我還可以刪除 Daily Summary 列,因為它只包含文本。

          df.drop(['Daily Summary','Loud Cover'],axis=1,inplace=True)

          最后,處理缺失值:

          df.isnull().sum()

          給出以下輸出:

          Formatted Date ? ? ? ? ? ? ? 0
          Summary ? ? ? ? ? ? ? ? ? ? ? 0
          Precip Type ? ? ? ? ? ? ? ? 517
          Temperature (C) ? ? ? ? ? ? ? 0
          Apparent Temperature (C) ? ? 0
          Humidity ? ? ? ? ? ? ? ? ? ? 0
          Wind Speed (km/h) ? ? ? ? ? ? 0
          Wind Bearing (degrees) ? ? ? 0
          Visibility (km) ? ? ? ? ? ? ? 0
          Pressure (millibars) ? ? ? ? 0

          Precip Type 列包含一些缺失值,也刪除它。

          df.dropna(inplace=True)

          數(shù)據(jù)清洗

          首先,我將分類數(shù)據(jù)轉(zhuǎn)換為數(shù)值數(shù)據(jù):

          from sklearn.preprocessing import LabelEncoder

          le = LabelEncoder()
          df['Precip Type']=le.fit_transform(df['Precip Type'])
          df['Summary']=le.fit_transform(df['Summary'])

          然后,特征標(biāo)準(zhǔn)化:

          from sklearn.preprocessing import StandardScaler
          scaler = StandardScaler()
          df[df.columns[2:]] = scaler.fit_transform(df[df.columns[2:]])

          從第三列開始,因為我沒有標(biāo)準(zhǔn)化前兩列(日期時間和摘要)。

          特征工程

          現(xiàn)在,準(zhǔn)備提取一年中的日期和時間。我定義了一個函數(shù),在給定日期的情況下,提取正弦和天數(shù)和小時數(shù)的余弦:

          import numpy as np
          from datetime import datetime

          def discretize_date(current_date, t):
          ? current_date = current_date[:-10]
          ? cdate = datetime.strptime(current_date, '%Y-%m-%d %H:%M:%S')
          ? ?
          ? if t == 'hour_sin':
          ? ? ? return np.sin(2 * np.pi * cdate.hour/24.0)
          ? if t == 'hour_cos':
          ? ? ? return np.cos(2 * np.pi * cdate.hour/24.0)
          ? if t == 'day_sin':
          ? ? ? return np.sin(2 * np.pi * cdate.timetuple().tm_yday/365.0)
          ? if t == 'day_cos':
          ? ? ? return np.cos(2 * np.pi * cdate.timetuple().tm_yday/365.0)

          現(xiàn)在提取新特征:

          date_types = ['hour_sin', 'hour_cos', 'day_sin', 'day_cos']
          for dt in date_types:
          ? df[dt] = df['Formatted Date'].apply(lambda x : discretize_date(x, dt))
          df.drop(['Formatted Date'],axis=1,inplace=True)

          計算特征之間的相關(guān)性,以檢查是否存在一些高度相關(guān)的特征。在這種情況下,可以刪除兩個相關(guān)的特征之一。

          df.corr()


          Apparent Temperature 和Temperature 高度相關(guān),因此我可以刪除Apparent Temperature:

          df.drop(['Apparent Temperature (C)'],axis=1,inplace=True)

          訓(xùn)練測試拆分

          我在 X 和 y 中拆分?jǐn)?shù)據(jù),然后在訓(xùn)練和測試集中:

          from sklearn.model_selection import train_test_split
          X = df.iloc[:,1:]
          y=df.iloc[:,0]?

          X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=1)

          模型訓(xùn)練和評估

          我測試了兩種模型,一種具有 DateTime 特征,另一種沒有。首先,使用 DateTimeFeatures 訓(xùn)練模型:

          from sklearn.ensemble import RandomForestClassifier

          model = RandomForestClassifier(max_depth=32,n_estimators=120,random_state=1)
          model.fit(X_train,y_train)
          y_pred = model.predict(X_test)

          計算精度:

          from sklearn.metrics import accuracy_score
          accuracy_score(y_test, y_pred)
          0.6695389319342622

          現(xiàn)在,在沒有 DateTime特征的情況下訓(xùn)練模型:

          model = RandomForestClassifier(max_depth=32,n_estimators=120,random_state=1)
          model.fit(X_train[X_train.columns[:-4]],y_train)
          y_pred = model.predict(X_test[X_test.columns[:-4]])
          accuracy_score(y_test, y_pred)
          0.5827108161634411

          具有 DateTime 特征的模型如何優(yōu)于其他模型。

          總結(jié)


          以上就是如何從機器學(xué)習(xí)模型中提取 DateTime 特征!本文中描述的實際示例表明,日期時間特征的存在可以提高機器學(xué)習(xí)模型的性能。

          下面帶來一個具有挑戰(zhàn)性的問題:

          DateTime 功能是否會引入過擬合?

          瀏覽 117
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  免费看美女黄片操逼视频 | 特操逼| 欧美在线色图 | 黄色视屏欧美日韩 | 青娱乐在线精品 |