1. 維度爆炸?Python實(shí)現(xiàn)數(shù)據(jù)壓縮竟如此簡(jiǎn)單!

        共 3773字,需瀏覽 8分鐘

         ·

        2020-08-16 02:08

        前言

        在之前的文章中,我們已經(jīng)詳細(xì)介紹了主成分分析的原理,并用Python基于主成分分析的客戶信貸評(píng)級(jí)進(jìn)行實(shí)戰(zhàn)。

        在那篇文章中我們指出的主成分分析常見(jiàn)的三個(gè)應(yīng)用場(chǎng)景中,其中有一個(gè)是「數(shù)據(jù)描述」,以描述產(chǎn)品情況為例,比如著名的波士頓矩陣,子公司業(yè)務(wù)發(fā)展?fàn)顩r,區(qū)域投資潛力等,需要將多變量壓縮到少數(shù)幾個(gè)主成分進(jìn)行描述,壓縮到兩個(gè)主成分是最理想的,這樣便可在一張圖內(nèi)表現(xiàn)出來(lái)。

        但這類分析一般做主成分分析是不充分的,能夠做到因子分析更好。但因子分析的知識(shí)點(diǎn)非常龐雜,所以本文將跳過(guò)原理,直接通過(guò)案例再次「實(shí)戰(zhàn)PCA分析」,用于主成分分析到因子分析的一個(gè)過(guò)渡,目標(biāo)有兩個(gè):

        • 能夠通過(guò)主成分分析結(jié)果來(lái)估計(jì)生成的主成分所表示的含義
        • 借以引出因子分析的優(yōu)勢(shì)和學(xué)習(xí)的必要性是本文的目標(biāo)。

        需求說(shuō)明

        上司希望從事數(shù)據(jù)分析崗位的你僅用兩個(gè)短句就概括出以下數(shù)據(jù)集所反映出的經(jīng)濟(jì)現(xiàn)象用幾個(gè)長(zhǎng)句都不一定能夠很好的描述數(shù)據(jù)集的價(jià)值,更何況高度凝練的兩個(gè)短句,短短九個(gè)指標(biāo)就已經(jīng)十分讓人頭疼了,如果表格再寬一些呢,比如有二三十個(gè)變量?

        Python實(shí)戰(zhàn)

        本節(jié)我們將使用Python對(duì)上面的數(shù)據(jù)進(jìn)行分析

        數(shù)據(jù)探索

        import?pandas?as?pd
        import?numpy?as?np
        import?matplotlib.pyplot?as?plt
        plt.style.use('seaborn-whitegrid')

        plt.rc('font',?**{'family':?'Microsoft?YaHei,?SimHei'})?
        ?#?設(shè)置中文字體的支持
        plt.rcParams['axes.unicode_minus']?=?False
        #?解決保存圖像是負(fù)號(hào)'-'顯示為方塊的問(wèn)題
        sns.set(font='SimHei')??#?解決Seaborn中文顯示問(wèn)題

        df?=?pd.read_csv('城市經(jīng)濟(jì).csv')
        df

        在做主成分分析前,都應(yīng)該進(jìn)行變量間相關(guān)性的探索,畢竟如果變量是獨(dú)立的,則不可壓縮。

        plt.figure(figsize=(8,?6))
        sns.heatmap(data=df.corr(),?annot=True)?#?annot=True:?顯示數(shù)字

        發(fā)現(xiàn)變量間的相關(guān)性較高,有變量壓縮的必要性

        PCA建模

        數(shù)據(jù)標(biāo)準(zhǔn)化

        使用中心標(biāo)準(zhǔn)化,即將變量都轉(zhuǎn)化成z分?jǐn)?shù)的形式,避免量綱問(wèn)題對(duì)壓縮造成影響

        from?sklearn.preprocessing?import?scale
        data?=?df.drop(columns='area')?#?丟棄無(wú)用的類別變量
        data?=?scale(data)

        初步建模

        需要說(shuō)明的是第一次的n_components參數(shù)最好設(shè)置得大一些(保留的主成份),觀察explained_variance_ratio_取值變化,即每個(gè)主成分能夠解釋原始數(shù)據(jù)變異的百分比

        from?sklearn.decomposition?import?PCA
        pca?=?PCA(n_components=9)?#?直接與變量個(gè)數(shù)相同的主成分
        pca.fit(data)

        結(jié)果分析

        累積解釋變異程度

        #?累積解釋變異程度
        plt.plot(np.cumsum(pca.explained_variance_ratio_),?linewidth=3)
        plt.xlabel('成份數(shù)')
        plt.ylabel('累積解釋方差');?plt.grid(True)

        可以看出,當(dāng)取主成分?jǐn)?shù)為2時(shí),累積解釋方差就已經(jīng)達(dá)到0.97有多(0.85 就已經(jīng)足夠),說(shuō)明我們只需要取兩個(gè)主成分即可

        重新建模

        綜上可知兩個(gè)主成分就已經(jīng)足夠了

        pca?=?PCA(n_components=2)?#?直接與變量個(gè)數(shù)相同的主成分
        pca.fit(data)

        pca.explained_variance_ratio_

        new_data?=?pca.fit_transform(data)?#??fit_transform?表示將生成降維后的數(shù)據(jù)
        #?查看規(guī)模差別
        print("原始數(shù)據(jù)集規(guī)模:???",?data.shape)
        print("降維后的數(shù)據(jù)集規(guī)模:",?new_data.shape)

        可以看到9個(gè)變量壓縮成兩個(gè)主成分!

        主成分中各變量的權(quán)重分析

        先看兩個(gè)主成分與 9 個(gè)變量的系數(shù)關(guān)系

        results?=?pd.DataFrame(pca.components_).T
        results.columns?=?['pca_1',?'pca_2']
        results.index?=?df.drop(columns='area').columns
        results

        可以明顯看出:

        • 主成分1幾乎不受data的第二個(gè)自變量人均GDP的影響,0.034,其他自變量對(duì)其影響程度都差不多。
        • 主成分2受data的第二個(gè)自變量人均GDP影響最大,達(dá)到了0.94

        結(jié)果描述

        通過(guò)上面的PCA建模,我們把9個(gè)自變量壓縮成了2 主成分,每個(gè)主成分受哪些變量的影響也有了了解。雖然得到的主成分都沒(méi)有什么意義,但我們是否可以通過(guò)變量們對(duì)主成分的影響程度來(lái)為生成的兩個(gè)主成分命名呢?

        第一個(gè)主成分在表達(dá)經(jīng)濟(jì)總量的指標(biāo)上的權(quán)重相當(dāng),可考慮命名為經(jīng)濟(jì)總量水平;而第二個(gè)主成分只在人均GDP上權(quán)重很高,可暫時(shí)考慮命名為人均水平

        注意:這里的給主成分命名(包括后續(xù)有關(guān)因子分析的推文)都是對(duì)降維后的數(shù)據(jù)進(jìn)行的,而不是生成的主成分,這樣才有比較和描述的價(jià)值。每個(gè)自變量在生成的主成分上的權(quán)重只是給這個(gè)主成分的命名提供參考,真正的命名操作是對(duì)壓縮后的數(shù)據(jù)進(jìn)行。

        new_data?=?pca.fit_transform(data)?#??fit_transform?表示將生成降維后的數(shù)據(jù)
        results?=?df.join(pd.DataFrame(new_data,??#?new_data?是降維后的數(shù)據(jù)
        ????????????columns=['經(jīng)濟(jì)總量水平',?'人均水平']))?#?與原來(lái)的數(shù)據(jù)拼接
        results

        繪制波士頓矩陣,這里的散點(diǎn)圖的點(diǎn)標(biāo)注代碼是前人的優(yōu)秀輪子,直接拿來(lái)用即可。

        plt.figure(figsize=(10,?8))
        #?基礎(chǔ)散點(diǎn)圖
        x,?y?=?results['經(jīng)濟(jì)總量水平'],?results['人均水平']
        label?=?results['area']
        plt.scatter(x,?y)
        plt.xlabel('經(jīng)濟(jì)總量水平');?plt.ylabel('人均水平')

        #?對(duì)散點(diǎn)圖中的每一個(gè)點(diǎn)進(jìn)行文字標(biāo)注
        ?##?固定代碼,無(wú)需深究,拿來(lái)即用
        ?##?給點(diǎn)標(biāo)注是需要將?x?和?y?以及標(biāo)簽如上段代碼那樣單獨(dú)拆開
        for?a,b,l?in?zip(x,y,label):
        ????plt.text(a,?b+0.1,?'%s.'?%?l,?ha='center',?va='bottom',?fontsize=14)

        #?添加兩條豎線
        plt.vlines(x=results['經(jīng)濟(jì)總量水平'].mean(),?
        ???????????ymin=-1.5,?ymax=3,?colors='red')
        plt.hlines(y=results['人均水平'].mean(),?
        ???????????xmin=-4,?xmax=6,?colors='red')

        最終從上圖可以看出:

        • 廣西,河北,福建三地的人均水平和經(jīng)濟(jì)總量水平都偏低
        • 上海的人均經(jīng)濟(jì)水平很高,但經(jīng)濟(jì)總量水平缺只是略優(yōu)于均值
        • 廣東的人均經(jīng)濟(jì)水平稍次于均值,但經(jīng)濟(jì)總量水平很高
        • ......

        小結(jié)

        本文再次講解了基于主成分分析的樣本特征描述,并使用Python示范了完整的流程。其中,也對(duì)由多個(gè)自變量生成的主成分的命名描述操作中需要注意的點(diǎn)作了比較詳細(xì)的說(shuō)明。其實(shí)PCA并不能非常好的滿足維度分析的需求,能夠做到「因子分析」最好,它是主成分方法的拓展,作為維度分析的手段,因子分析也是構(gòu)造合理的聚類模型和穩(wěn)健的分類模型的必然步驟。所以我們因子分析案例再見(jiàn)~

        今天的文章就到這里,如果你喜歡本系列請(qǐng)點(diǎn)亮在看給作者一點(diǎn)鼓勵(lì)~

        ?

        Python商業(yè)數(shù)據(jù)挖掘自動(dòng)化系列代碼及數(shù)據(jù)已經(jīng)上傳GitHub,如有需要可以自行下載:「https://github.com/liuhuanshuo/zaoqi-Python/tree/master/商業(yè)數(shù)據(jù)分析實(shí)戰(zhàn)」

        ?



        文末送書福利

        最近更新了很多數(shù)據(jù)挖掘的文章,今天推薦的書為Python入門到人工智能實(shí)戰(zhàn)(全書共20 章,包括Python 安裝配置、Python 語(yǔ)言基礎(chǔ)、流程控制語(yǔ)句、序列、函數(shù)、對(duì)象、文件及異常處理、數(shù)據(jù)處理和分析的重要模塊NumPy、Pandas、機(jī)器學(xué)習(xí)基礎(chǔ)、機(jī)器學(xué)習(xí)常用調(diào)優(yōu)方法、神經(jīng)網(wǎng)絡(luò)、卷積神經(jīng)網(wǎng)絡(luò),以及使用PyTorch、Keras 實(shí)現(xiàn)多個(gè)人工智能實(shí)戰(zhàn)案例等)點(diǎn)擊下方圖片可以直達(dá)購(gòu)買頁(yè)面查看詳情與購(gòu)買(現(xiàn)在京東和當(dāng)當(dāng)都有優(yōu)惠)

        送書規(guī)則還是和以前一樣,一共抽3本,點(diǎn)擊下方小程序即可參與抽獎(jiǎng),點(diǎn)亮在看能增加中獎(jiǎng)率哦~



        瀏覽 44
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

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

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 国产天天综合 | 国产7页| 竹内纱里奈在厨房被强 | 亚洲美女久久久 | 日韩va|