1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        【機(jī)器學(xué)習(xí)特征工程基礎(chǔ)】提取新特征提高模型準(zhǔn)確性

        共 4877字,需瀏覽 10分鐘

         ·

        2022-02-17 11:39

        ↓↓↓點(diǎn)擊關(guān)注,回復(fù)資料,10個(gè)G的驚喜

        來源?DeepHub IMBA

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

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


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

        從日期中提取特征


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

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

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

        • 一年中的一天或一個(gè)月中的一天或一周中的一天

        • 一年中的月份

        • 季節(jié)


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

        一年中的一天或一個(gè)月中的一天或一周中的一天

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

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

        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é)是一個(gè)分類變量,包括以下值:春季、夏季、秋季和冬季。

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

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


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

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

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

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

        從時(shí)間中提取特征


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

        在 Python 中,給定一個(gè) DateTime 變量,可以按如下方式提取一個(gè)小時(shí):

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

        一個(gè)實(shí)際的例子


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

        此示例的目的是構(gòu)建一個(gè)多類分類器,該分類器根據(jù)輸入特征預(yù)測天氣狀況(由數(shù)據(jù)集的摘要列給出)。我計(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 列,因?yàn)樗话谋尽?/span>

        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:]])

        從第三列開始,因?yàn)槲覜]有標(biāo)準(zhǔn)化前兩列(日期時(shí)間和摘要)。

        特征工程

        現(xiàn)在,準(zhǔn)備提取一年中的日期和時(shí)間。我定義了一個(gè)函數(shù),在給定日期的情況下,提取正弦和天數(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)

        計(jì)算特征之間的相關(guān)性,以檢查是否存在一些高度相關(guān)的特征。在這種情況下,可以刪除兩個(gè)相關(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)

        計(jì)算精度:

        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é)


        以上就是如何從機(jī)器學(xué)習(xí)模型中提取 DateTime 特征!本文中描述的實(shí)際示例表明,日期時(shí)間特征的存在可以提高機(jī)器學(xué)習(xí)模型的性能。
        1. 準(zhǔn)備寫本書
        2. 【虎年大吉】技術(shù)年貨大禮包
        3. Pytorch 常用損失函數(shù)拆解
        4. 吳恩達(dá)最新采訪:以數(shù)據(jù)為中心的AI
        5. 人人都能看懂的EM算法推導(dǎo)
        6. 騰訊發(fā)布國內(nèi)首份可解釋 AI 報(bào)告!

        三連在看,月入百萬??


        瀏覽 88
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            97人人干| 国产三级片播放 | 人妻无码视频 | 男生鸡鸡插入女生屁股 | 豪妇荡乳1一5白玉兰在线看 | 久久精品福利视频 | 天天操天天草 | www.热久久 | 豆花av在线 | 人人天天爽 |