成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python數(shù)據(jù)分析真的不難學(xué),實(shí)戰(zhàn)來(lái)了:大佬級(jí)別數(shù)據(jù)預(yù)處理方式

大數(shù)據(jù) 數(shù)據(jù)分析
這次我們專(zhuān)門(mén)挑了一份爛大街的數(shù)據(jù)集Titanic,寫(xiě)了一點(diǎn)關(guān)于數(shù)據(jù)預(yù)處理部分,但是代碼風(fēng)格卻是大(zhuang)佬(bi)級(jí)別。很明顯,我不是大佬,不過(guò)是有幸被培訓(xùn)過(guò)。

這次我們專(zhuān)門(mén)挑了一份爛大街的數(shù)據(jù)集Titanic,寫(xiě)了一點(diǎn)關(guān)于數(shù)據(jù)預(yù)處理部分,但是代碼風(fēng)格卻是大(zhuang)佬(bi)級(jí)別。很明顯,我不是大佬,不過(guò)是有幸被培訓(xùn)過(guò)。

說(shuō)到預(yù)處理,一般就是需要:

  • 數(shù)字型缺失值處理
  • 類(lèi)別型缺失值處理
  • 數(shù)字型標(biāo)準(zhǔn)化
  • 類(lèi)別型特征變成dummy變量
  • Pipeline 思想

在做數(shù)據(jù)處理以及機(jī)器學(xué)習(xí)的過(guò)程中,最后你會(huì)發(fā)現(xiàn)每個(gè)項(xiàng)目似乎都存在“套路”。所有的項(xiàng)目處理過(guò)程都會(huì)存在一個(gè)“套路”:

  • 預(yù)處理
  • 建模
  • 訓(xùn)練
  • 預(yù)測(cè)

對(duì)于預(yù)處理,其實(shí)也是一個(gè)套路,不過(guò)我們不用pipeline 函數(shù),而是另一個(gè)FeatureUnion函數(shù)。

當(dāng)然一個(gè)函數(shù)也不能解決所有問(wèn)題,我們通過(guò)實(shí)戰(zhàn)來(lái)看看哪些函數(shù)以及編碼風(fēng)格能讓我們的代碼看起來(lái)很有條理并且“大(zhuang)佬(bi)”風(fēng)格十足。

導(dǎo)入數(shù)據(jù)開(kāi)啟實(shí)戰(zhàn)

今天我們分析的titanic 數(shù)據(jù),數(shù)據(jù)我已經(jīng)下載,并且放在項(xiàng)目路徑下的data 文件中。

  1. import pandas as pd 
  2. file = 'data/titanic_train.csv' 
  3. raw_df = pd.read_csv(file) 

接下來(lái)就是標(biāo)準(zhǔn)套路:預(yù)覽info以及預(yù)覽head。

  1. print(raw_df.info()) 
  2. print(raw_df.head()) 

我們對(duì)數(shù)據(jù)集的名稱(chēng)進(jìn)行簡(jiǎn)單的回顧:

  • RangeIndex: 891 entries, 0 to 890:表示891 個(gè)樣本
  • columns :共12 列

按數(shù)據(jù)類(lèi)型來(lái)劃分:

int64 :

  • PassengerId :乘客ID
  • Survived:是否生存,1 為生存
  • Pclass :乘客級(jí)別
  • SibSp :sibling and spouse (兄弟姐妹以及配偶個(gè)數(shù))Parch :parents and children(父母以及子女個(gè)數(shù))

object:

  • Name: 名字
  • Sex:性別
  • Ticket :船票編號(hào)
  • Cabin:船艙號(hào)
  • Embarked:登船地點(diǎn)

float64:

  • Age:年齡
  • Fare 票價(jià)
  1. RangeIndex: 891 entries, 0 to 890 
  2. Data columns (total 12 columns): 
  3.  #   Column       Non-Null Count  Dtype   
  4. ---  ------       --------------  -----   
  5.  0   PassengerId  891 non-null    int64   
  6.  1   Survived     891 non-null    int64   
  7.  2   Pclass       891 non-null    int64   
  8.  3   Name         891 non-null    object  
  9.  4   Sex          891 non-null    object  
  10.  5   Age          714 non-null    float64 
  11.  6   SibSp        891 non-null    int64   
  12.  7   Parch        891 non-null    int64   
  13.  8   Ticket       891 non-null    object  
  14.  9   Fare         891 non-null    float64 
  15.  10  Cabin        204 non-null    object  
  16.  11  Embarked     889 non-null    object  
  17. dtypes: float64(2), int64(5), object(5) 
  18. memory usage: 83.7+ KB 

一般的機(jī)器學(xué)習(xí)都不會(huì)預(yù)處理缺失值以及類(lèi)別型數(shù)據(jù),因此我們至少要對(duì)這兩種情形做預(yù)處理。

首先我們查看缺失值,其實(shí)上文中的info已經(jīng)有這樣的信息。這里我們更顯式的展示缺失信息。

  1. # get null count for each columns 
  2. nulls_per_column = raw_df.isnull().sum() 
  3. print(nulls_per_column) 

結(jié)果如下:

  1. PassengerId       0 
  2. Survived             0 
  3. Pclass                 0 
  4. Name                 0 
  5. Sex                     0 
  6. Age                177 
  7. SibSp                  0 
  8. Parch                  0 
  9. Ticket                 0 
  10. Fare                    0 
  11. Cabin             687 
  12. Embarked          2 
  13. dtype: int64 

可以看到Age 有缺失,Age是float64 類(lèi)型數(shù)據(jù),Cabin 有缺失,Cabin 為object 類(lèi)型,Embarked 有缺失,Embarked 也是object 類(lèi)型。

主角登場(chǎng)(策略與函數(shù))

上述我們可以看到缺失的列有哪些,對(duì)于有些情況,比如快速清理數(shù)據(jù),我們僅僅會(huì)制定如下策略:

對(duì)于float類(lèi)型,我們一般就是用均值或者中位數(shù)來(lái)代替 對(duì)于object 類(lèi)型,如果ordinal 類(lèi)型,也就是嚴(yán)格類(lèi)別之分,比如(男,女),比如(高,中,低)等,一般就用眾數(shù)來(lái)替代 對(duì)于object 類(lèi)型,如果nominal類(lèi)型,也就是沒(méi)有等級(jí)/嚴(yán)格類(lèi)別關(guān)系,比如ID,我們就用常值來(lái)替代。本文中用到的是sklearn的preprocessing 模塊,pipeline模塊,以及一個(gè)第三方“新秀”sklearn_pandas 庫(kù)。

這里我們簡(jiǎn)單的介紹這個(gè)函數(shù)的用途。

  1. StandardScaler: 用于對(duì)數(shù)字類(lèi)型做標(biāo)準(zhǔn)化處理 
  2. LabelBinarizer: 顧名思義,將類(lèi)型類(lèi)型,先label 化(變成數(shù)字),再Binarize (變成二進(jìn)制)。相當(dāng)于onehot 編碼,不過(guò)LabelBinarizer只是針對(duì)一列進(jìn)行處理 
  3. FeatureUnion:用于將不同特征預(yù)處理過(guò)程(函數(shù))重新合并,但是需要注意的是它的輸入不是數(shù)據(jù)而是transformer,也就是預(yù)處理的方法。 
  4. SimpleImputer:sklearn 自帶了類(lèi)似于fillna的預(yù)處理函數(shù) 
  5. CategoricalImputer: 來(lái)自于sklearn_pandas 的補(bǔ)充,因?yàn)閟klearn 中并沒(méi)有針對(duì)類(lèi)別類(lèi)型數(shù)據(jù)的預(yù)處理。 
  6. DataFrameMapper: 相當(dāng)于構(gòu)建針對(duì)dataframe的不同的列構(gòu)建不同的transformer。 
  7. from sklearn.preprocessing import StandardScaler 
  8. from sklearn.preprocessing import LabelBinarizer 
  9. from sklearn.pipeline import FeatureUnion 
  10. from sklearn_pandas import CategoricalImputer 
  11. from sklearn_pandas import DataFrameMapper 
  12. from sklearn.impute import SimpleImputer 

按照我們策略,我們需要將列分為數(shù)字型和類(lèi)別型。思路就是看一列數(shù)據(jù)是否為object類(lèi)型。

  1. # split categorical columns and numerical columns 
  2. categorical_mask = (raw_df.dtypes == object) 
  3. categorical_cols = raw_df.columns[categorical_mask].tolist() 
  4. numeric_cols = raw_df.columns[~categorical_mask].tolist() 
  5. numeric_cols.remove('Survived'
  6. print(f'categorical_cols are {categorical_cols}' ) 
  7. print(f'numeric_cols are {numeric_cols}' ) 

print:

  1. categorical_cols are ['Name''Sex''Ticket''Cabin''Embarked'
  2. numeric_cols are ['PassengerId''Pclass''Age''SibSp''Parch''Fare'

數(shù)值型數(shù)據(jù)預(yù)處理

對(duì)數(shù)值型數(shù)據(jù)進(jìn)行預(yù)處理,這里我們采用DataFrameMapper來(lái)創(chuàng)建這個(gè)transformer 對(duì)象,對(duì)所有的numeric_cols 進(jìn)行填寫(xiě)中值。

  1. numeric_fillna_mapper=DataFrameMapper([([col], SimpleImputer(strategy="median")) for col in numeric_cols], 
  2.                                             input_df=True
  3.                                             df_out=True 
  4.                                            ) 

我們可以測(cè)試代碼,看一下變換后的數(shù)據(jù)是什么樣。這里需要調(diào)用fit_transform 方法。

  1. transformed = numeric_fillna_mapper.fit_transform(raw_df) 
  2. print(transformed.info()) 

結(jié)果如下,可以看到變換后的數(shù)據(jù)只包含我們處理的列,并且可以看到non-null 個(gè)數(shù)已經(jīng)為891,表明沒(méi)有缺失。

  1. #   Column       Non-Null Count  Dtype   
  2. --  ------       --------------  -----   
  3. 0   PassengerId  891 non-null    float64 
  4. 1   Pclass       891 non-null    float64 
  5. 2   Age          891 non-null    float64 
  6. 3   SibSp        891 non-null    float64 
  7. 4   Parch        891 non-null    float64 
  8. 5   Fare         891 non-null    float64 

如果我們需要對(duì)數(shù)值型特征,先進(jìn)行缺失值填充,然后再進(jìn)行標(biāo)準(zhǔn)化。這樣我們只需要將上面的函數(shù)重新修改,增加一個(gè)transformer list。這個(gè)transformer list包含SimpleImputer 和StandardScaler 兩步。

  1. # fill nan with mean 
  2. and then standardize cols 
  3. numeric_fillna_standardize_mapper=DataFrameMapper([([col], [SimpleImputer(strategy="median"), 
  4.                                                 StandardScaler()]) for col in numeric_cols], 
  5.                                             input_df=True
  6.                                             df_out=True 
  7.                                            ) 
  8. fillna_standardized = numeric_fillna_standardize_mapper.fit_transform(raw_df) 
  9.  
  10. print(fillna_standardized.head()) 

預(yù)覽變換后的結(jié)果:

  1.    PassengerId       Pclass          Age        SibSp        Parch          Fare 
  2. 0    -1.730108  0.827377 -0.565736  0.432793 -0.473674 -0.502445 
  3. 1    -1.726220 -1.566107  0.663861  0.432793 -0.473674  0.786845 
  4. 2    -1.722332  0.827377 -0.258337 -0.474545 -0.473674 -0.488854 
  5. 3    -1.718444 -1.566107  0.433312  0.432793 -0.473674  0.420730 
  6. 4    -1.714556  0.827377  0.433312 -0.474545 -0.473674 -0.486337 

這樣我們就完成了數(shù)值型數(shù)據(jù)的預(yù)處理。類(lèi)似的我們可以針對(duì)類(lèi)別型數(shù)據(jù)進(jìn)行預(yù)處理。

類(lèi)別型數(shù)據(jù)預(yù)處理

本例中,Cabin 有缺失,Embarked 有缺失,因?yàn)檫@兩者都是有有限類(lèi)別個(gè)數(shù)的,我們可以用出現(xiàn)最高頻次的數(shù)據(jù)進(jìn)行填充,假如是Name 缺失呢?一般Name都沒(méi)有重名的,而且即便有個(gè)別重名,用最高頻次的數(shù)據(jù)進(jìn)行填充也沒(méi)有意義。所以我們會(huì)選擇用常數(shù)值填充,比如“unknown”等。

作為一個(gè)模板,這里我們的處理方法要涵蓋兩種情況。

['Name','Cabin','Ticket'] 其實(shí)都類(lèi)似于ID,幾乎沒(méi)有重復(fù)的,我們用常值替代,然后用LabelBinarizer變成dummy 變量 其他列,我們用最高頻次的類(lèi)別填充,然后用LabelBinarizer變成dummy 變量。

  1. # Apply categorical imputer 
  2.  
  3. constant_cols = ['Name','Cabin','Ticket'
  4. frequency_cols = [_ for _  in categorical_cols if _ not in constant_cols] 
  5.  
  6. categorical_fillna_freq_mapper = DataFrameMapper( 
  7.                                                 [(col, [CategoricalImputer(),LabelBinarizer()]) for col in frequency_cols], 
  8.                                                 input_df=True
  9.                                                 df_out=True 
  10.                                                ) 
  11.  
  12. categorical_fillna_constant_mapper = DataFrameMapper( 
  13.                                                 [(col, [CategoricalImputer(strategy='constant',fill_value='unknown'),LabelBinarizer()]) for col in constant_cols], 
  14.                                                 input_df=True
  15.                                                 df_out=True 
  16.                                                ) 

我們同樣進(jìn)行測(cè)試代碼:

  1. transformed = categorical_fillna_freq_mapper.fit_transform(raw_df) 
  2. print(transformed.info()) 
  3. transformed = categorical_fillna_constant_mapper.fit_transform(raw_df) 
  4. print(transformed.shape) 

結(jié)果如下:

  1. Data columns (total 4 columns): 
  2.  #   Column      Non-Null Count  Dtype 
  3. ---  ------      --------------  ----- 
  4.  0   Sex         891 non-null    int32 
  5.  1   Embarked_C  891 non-null    int32 
  6.  2   Embarked_Q  891 non-null    int32 
  7.  3   Embarked_S  891 non-null    int32 
  8. dtypes: int32(4) 

以及:

  1. (891, 1720) 

featureunion 所有的預(yù)處理過(guò)程

前面我們已經(jīng)測(cè)試了每一種的預(yù)處理的方式(transfomer 或者稱(chēng)為mapper),可以看到結(jié)果中只包含處理的部分列對(duì)應(yīng)的結(jié)果。

實(shí)際中,我們可以用FeatureUnion,直接將所有需要處理的方式(transfomer 或者稱(chēng)為mapper)變成一個(gè)pipeline,一目了然。

然后調(diào)用fit_transform 對(duì)原始數(shù)據(jù)進(jìn)行變換,這樣我們的預(yù)處理看起來(lái)更有條理。

  1. feature_union_1 = FeatureUnion([("numeric_fillna_standerdize", numeric_fillna_standardize_mapper), 
  2.                               ("cat_freq", categorical_fillna_freq_mapper), 
  3.                                 ("cat_constant", categorical_fillna_constant_mapper)]) 
  4.  
  5. df_1 = feature_union_1.fit_transform(raw_df) 
  6.  
  7. print(df_1.shape) 
  8. print(raw_df.shape) 

總結(jié)

本文介紹了“大佬”級(jí)別的數(shù)據(jù)預(yù)處理方式,并且是在實(shí)戰(zhàn)中進(jìn)行演示。

通過(guò)本文可以學(xué)到:

  • 數(shù)值型預(yù)處理,通過(guò)DataFrameMapper 直接對(duì)數(shù)值類(lèi)型的列進(jìn)行多次變換
  • 類(lèi)別型預(yù)處理,通過(guò)DataFrameMapper 直接對(duì)類(lèi)別型的列進(jìn)行多次變換
  • 類(lèi)別型變換方法可以至少采用兩種方式
  • LabelBinarizer,SimpleImputer,CategoricalImputer,LabelBinarizer等函數(shù)對(duì)數(shù)據(jù) 進(jìn)行變換
  • FeatureUnion 來(lái)將預(yù)處理過(guò)程管道化(pipeline) 通過(guò)這樣的方式處理數(shù)據(jù),會(huì)一目了然。

 

責(zé)任編輯:未麗燕 來(lái)源: 今日頭條
相關(guān)推薦

2025-01-27 12:19:51

2020-09-01 17:19:36

數(shù)據(jù)監(jiān)控建模

2020-08-16 12:44:59

小費(fèi)數(shù)據(jù)集Python數(shù)據(jù)分析

2018-06-05 11:27:12

2016-12-18 15:03:57

Python Scikit Lea數(shù)據(jù)

2016-12-20 16:07:13

Python數(shù)據(jù)預(yù)處理

2012-08-08 09:00:29

數(shù)據(jù)分析師

2024-04-07 08:50:00

GenAIAI人工智能

2024-07-01 13:51:14

2024-10-09 11:57:34

2021-03-28 08:57:57

Python 文本數(shù)據(jù)

2020-02-20 10:45:51

Python數(shù)據(jù)疾病

2010-01-22 18:32:23

VB.NET數(shù)據(jù)并發(fā)性

2020-05-14 10:19:23

Python可視化分析

2023-07-10 08:00:13

架構(gòu)Rest返回值

2018-08-16 10:05:07

2019-01-28 17:42:33

Python數(shù)據(jù)預(yù)處理數(shù)據(jù)標(biāo)準(zhǔn)化

2023-11-21 09:11:31

2020-11-06 17:20:14

PythonBAT代碼

2020-03-28 16:08:32

條形圖Python分析
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: xnxx 日本免费 | 黄色国产在线播放 | 性xxxxx | 成人在线看片 | 午夜网| 男女啪啪高潮无遮挡免费动态 | 亚洲高清在线观看 | 久久这里只有 | 精品视频在线免费观看 | 91影片| 久久国 | 黄色片免费 | 国产精品一区二区电影 | 国产成人在线一区二区 | 一区视频 | 久久久久久91 | 一区久久 | 欧美性jizz18性欧美 | 免费黄视频网站 | 正在播放国产精品 | 天天草天天操 | 欧美一区二区成人 | 日本精品一区二区在线观看 | 午夜寂寞影院列表 | 久久一区二区三区四区五区 | 中文字幕亚洲无线 | 国产色99精品9i | 国产精品一区在线观看 | 视频一区在线播放 | 国产中文字幕在线观看 | 欧美男人天堂 | 超碰在线网站 | 极品在线 | 久久这里只有精品首页 | 日韩视频一级 | 在线欧美一区 | 在线一区| 久久久久久久久久久久久久久久久久久久 | 国产亚洲第一页 | av在线播放不卡 | 黑人中文字幕一区二区三区 |