day2:今天進(jìn)行的是EDA部分,也就是數(shù)據(jù)探索性分析
EDA的目標(biāo)
-主要在于熟悉數(shù)據(jù)集,了解數(shù)據(jù)集,對(duì)數(shù)據(jù)集進(jìn)行驗(yàn)證,為下一步特征工程做基礎(chǔ)。
- 當(dāng)了解了數(shù)據(jù)集之后我們下一步就是要去了解變量間的相互關(guān)系以及變量與預(yù)測(cè)值之間的存在關(guān)系。
- 引導(dǎo)數(shù)據(jù)科學(xué)從業(yè)者進(jìn)行數(shù)據(jù)處理以及特征工程的步驟,使數(shù)據(jù)集的結(jié)構(gòu)和特征集讓接下來(lái)的預(yù)測(cè)問(wèn)題更加可靠。
- 完成對(duì)于數(shù)據(jù)的探索性分析,并對(duì)于數(shù)據(jù)進(jìn)行一些圖表或者文字總結(jié)并打卡。
判斷數(shù)據(jù)的缺失和異常
這部分是對(duì)給出的原始數(shù)據(jù)進(jìn)行整理,處理缺失值的大體手段可以分為:刪除、填充、映射到高維。
- 刪除:也就是將存在遺漏信息屬性值的對(duì)象(元組,記錄)刪除,從而得到一個(gè)完備的信息表。但是當(dāng)缺失數(shù)據(jù)所占比例較大,特別當(dāng)遺漏數(shù)據(jù)非隨機(jī)分布時(shí),這種方法可能導(dǎo)致數(shù)據(jù)發(fā)生偏離,從而引出錯(cuò)誤的結(jié)論。
- 填充:用一定的值去填充空值,從而使信息表完備化。通?;诮y(tǒng)計(jì)學(xué)原理,根據(jù)初始數(shù)據(jù)集中其余對(duì)象取值的分布情況來(lái)對(duì)一個(gè)缺失值進(jìn)行填充。常用的方法有 人工填寫(xiě)、特殊值填充(NaN作為一種特殊值)、平均值填充(數(shù)值型屬性用均值,非數(shù)值型用頻率最高值)、熱卡填充(就近補(bǔ)齊)、回歸(屬性是線性相關(guān)時(shí)比較好)、多重插補(bǔ)、c4.5等。還有就是不處理,在對(duì)樹(shù)結(jié)構(gòu)算法,貝葉斯網(wǎng)絡(luò)以及深度學(xué)習(xí)方法都是可以的。詳情
- 映射到高維空間,采用獨(dú)熱碼編碼(one-hot)技術(shù)。將包含K個(gè)離散取值范圍的屬性值擴(kuò)展為K+1個(gè)屬性值,若該屬性值缺失,則擴(kuò)展后的第K+1個(gè)屬性值置為1。這種做法是最精確的做法,保留了所有的信息,也未添加任何額外信息,若預(yù)處理時(shí)把所有的變量都這樣處理,會(huì)大大增加數(shù)據(jù)的維度。
查看屬性缺失值方法:
1.計(jì)數(shù)法
- DF.isnull().sum() 統(tǒng)計(jì)各變量的缺失值情況。
- DF.info() 可以查看個(gè)屬性的非空值總以及數(shù)值類(lèi)型
- DF.serise.unique() 查看Series對(duì)象的唯一值
- DF.Series.value_counts():查看Series對(duì)象的唯一值和計(jì)數(shù)
2.圖表法
1.msno.matrix() 可以快速直觀地挑選出圖案的數(shù)據(jù)完成
2.msno.bar(Test_data.sample(1000))是列的無(wú)效的簡(jiǎn)單可視化
3.msno.heatmap()相關(guān)性熱圖措施無(wú)效的相關(guān)性:一個(gè)變量的存在或不存在如何強(qiáng)烈影響的另一個(gè)的存在.
對(duì)于上面查找到的缺失值,如果確實(shí)數(shù)不多的情況,根據(jù)不同屬性的類(lèi)型及情況,采用不同的方法就行補(bǔ)充。數(shù)值型屬性用均值的方式補(bǔ)充,非數(shù)值型用該屬性頻率最高值補(bǔ)充、對(duì)于一些樹(shù)模型(c4.5,xgboost等)也可以不處理
雖然通過(guò)上面的方法可以看出缺失值的情況,但對(duì)于異常值的情況卻不能明顯的觀察到。所以還要查看屬性的異常值。
查看與處理異常值方法
異常值指的不是空值,而是一些沒(méi)有意義的值。比如 ‘-’、NaN等
1.查看
- value_counts() 查看所有類(lèi)型值及總數(shù)
- unique() 查看所有不同值
2.處理
- replace('-',np.nan,inplace=True)方法,將異常值進(jìn)行替換
- fillna()對(duì)異常值或者空值進(jìn)行填充
這里指的異常值是數(shù)據(jù)中的一些非正常值,同時(shí)異常值又是和數(shù)據(jù)分布相關(guān)的,比如一些噪音特別大的數(shù)據(jù),也可以稱(chēng)為是異常值,在處理這些值得時(shí)候基本遵循以下原則。
了解預(yù)測(cè)值的分布情況
對(duì)于預(yù)測(cè)值的分布情況觀察,如果是回歸,看看均值、方差,畫(huà)畫(huà)直方圖;如果是分類(lèi),看看各類(lèi)的比例,是否平衡。通過(guò)觀察對(duì)y的分布進(jìn)行處理,更好的減少噪音值對(duì)模型的泛化能力產(chǎn)生的影響。
查看分布的操作
單元分布 sns.distplot(y,kde=False)
- 直方圖(hist)+內(nèi)核密度函數(shù)(kde)
hist 、 kde參數(shù)可以控制單變量的一個(gè)直方圖和內(nèi)核密度函數(shù)曲線,快速的了解單變量的一個(gè)分布情況。- 控制擬合的參數(shù)分布圖形 :fit參數(shù)用于畫(huà)出不同分布的曲線圖,便于觀察數(shù)據(jù)符合哪一類(lèi)的分布,其需要傳入的是scipy 中的分布類(lèi)型。johnsonsu(無(wú)界約翰遜分布)、正態(tài)分布、對(duì)數(shù)分布等。
偏度和峰度都是統(tǒng)計(jì)量
- 偏度Skewness(三階) :指的是分布偏斜方向和程度的度量
偏度定義中包括正態(tài)分布(偏度=0),右偏分布(也叫正偏分布,其偏度>0),左偏分布(也叫負(fù)偏分布,其偏度<0)- 峰度Kurtosis (四階):表征概率密度分布曲線在平均值處峰值高低的特征數(shù)
峰度包括正態(tài)分布(峰度值=3),厚尾(峰度值>3),瘦尾(峰度值<3) 直觀的理解就是指越小越尖,越大就越扁- skew、kurt說(shuō)明參考
通過(guò)查看的方法,觀察到預(yù)測(cè)值的情況以后,對(duì)于存在的一些異常值(例如長(zhǎng)尾數(shù)據(jù),)可以考慮將一些出現(xiàn)頻次特別少的數(shù)據(jù)可以當(dāng)作異常值去除掉。同時(shí)對(duì)于分布比較亂的情況,比較常用的trick進(jìn)行l(wèi)og處理,使得分布的更加的均勻一些。
除了上面對(duì)單變量進(jìn)行處理,還可以考慮做一些雙變量核密度估計(jì),以及對(duì)于離散值的分布情況也可以進(jìn)行直觀的觀察。
- kdeplot :可用于對(duì)單變量和雙變量進(jìn)行核密度估計(jì)并可視化.
- rugplot:用于繪制出一維數(shù)組中數(shù)據(jù)點(diǎn)實(shí)際的分布位置情況,即不添加任何數(shù)學(xué)意義上的擬合,單純的將記錄值在坐標(biāo)軸上表現(xiàn)出來(lái).這更適合觀察到離散行數(shù)據(jù)的分布情況
- 詳細(xì)參數(shù)
此處是多變量之間的關(guān)系可視化,可視化更多學(xué)習(xí)可參考很不錯(cuò)的文章
通過(guò)這些方法的觀察,可以更好的看出單變量或雙變量的分布情況,更好的去除一些異常值,是其分布更符合特定的分布情況
問(wèn)題:回歸(離散)型預(yù)測(cè)值滿足什么樣的分布會(huì)比較好?以及常用什么處理方法達(dá)到特定的分布狀態(tài)?
了解類(lèi)別特征和數(shù)字特征
首先我們需要對(duì)所有的特征有一個(gè)大致的分析,分析其是類(lèi)別特征還是數(shù)字特征,不同的特征會(huì)采用不同的方式進(jìn)行處理,同時(shí)對(duì)于不同的模型對(duì)于特征類(lèi)型也有要求。
(比如在XGBoost和其他的Boosting Tree中,使用的Tree都是cart回歸樹(shù),這也就意味著該類(lèi)提升樹(shù)算法只接受數(shù)值特征輸入,不直接支持類(lèi)別特征)
1.數(shù)字特征分析:
對(duì)于數(shù)字型特征根據(jù)情況又是可能進(jìn)行分桶的操作,可以減少數(shù)據(jù)的范圍大小。同時(shí)還可以將數(shù)字型特征和預(yù)測(cè)值進(jìn)行相關(guān)性分析。主要是為了觀察不同特征與預(yù)測(cè)值的相關(guān)程度。(這里相關(guān)程度指的是數(shù)值之間的相互影響程度)
同時(shí)我們可以對(duì)特征的分布進(jìn)行觀察,查看特征得 偏度和峰值。目的是為了讓特征可以有一個(gè)更好的分布情況,減少一些異常值的影響。
主要的操作
- 相關(guān)性分析:sns.heatmap()函數(shù),其中數(shù)值越大代表相關(guān)程度越大。具體參數(shù)
- 查看其skew和kurt以及可視化其分布:skew()、kurt()、distplot()
這里也可以對(duì)數(shù)字特征與預(yù)測(cè)值之間進(jìn)行多變量關(guān)系的可視化。
問(wèn)題:如何根據(jù)可視化圖看出特征和預(yù)測(cè)值之間有線性關(guān)系?以及有了線性關(guān)系是否表示該特征對(duì)于模型學(xué)習(xí)更重要?
2.類(lèi)別特征分析:
類(lèi)別特征也分為數(shù)字離散型和非數(shù)字離散型。對(duì)于非數(shù)字型類(lèi)別特征的處理有兩種,一種是轉(zhuǎn)化成數(shù)字型,一種是轉(zhuǎn)化成one-hot(映射到高維空間) 可參考。對(duì)于數(shù)字型類(lèi)別特征,可以通過(guò)不同的可視化方式來(lái)反應(yīng)器分布狀況,具體方法如下:
a、箱形圖可視化
箱形圖顯示一組數(shù)據(jù)分散情況資料的統(tǒng)計(jì)圖。它能顯示出一組數(shù)據(jù)的最大值、最小值、中位數(shù)及上下四分位數(shù)。
sns.boxplot() 函數(shù): 詳情參考
b、小提琴圖可視化
它顯示了定量數(shù)據(jù)在一個(gè)(或多個(gè))分類(lèi)變量的多個(gè)層次上的分布,這些分布可以進(jìn)行比較。不像箱形圖中所有繪圖組件都對(duì)應(yīng)于實(shí)際數(shù)據(jù)點(diǎn),小提琴繪圖以基礎(chǔ)分布的核密度估計(jì)為特征。
sns.violinplot() 函數(shù): 詳情參考
c、柱形圖可視化
利用矩陣條的高度反映數(shù)值變量的集中趨勢(shì),以及使用errorbar功能(差棒圖)來(lái)估計(jì)變量之間的差值統(tǒng)計(jì)。請(qǐng)謹(jǐn)記bar plot展示的是某種變量分布的平均值,當(dāng)需要精確觀察每類(lèi)變量的分布趨勢(shì),boxplot與violinplot往往是更好的選擇。
sns.barplot() 函數(shù): 詳情參考
d、類(lèi)別頻數(shù)可視化
將它認(rèn)為一種應(yīng)用到分類(lèi)變量的直方圖,也可認(rèn)為它是用以比較類(lèi)別間計(jì)數(shù)差,調(diào)用count函數(shù)的barplot。
sns.countplot() 函數(shù): 詳情參考
各種科學(xué)庫(kù)
1.pandas:
數(shù)據(jù)讀取
-
read_csv 功能:從文件、URL、文件新對(duì)象中加載帶有分隔符的數(shù)據(jù),默認(rèn)分隔符是逗號(hào)
- sep : str, default ‘,’ 指定分隔符。
- delimiter : str, default None 定界符,備選分隔符(如果指定該參數(shù),則sep參數(shù)失效)
- 詳細(xì)介紹
read_tabel 功能:從文件、URL、文件型對(duì)象中加載帶分隔符的數(shù)據(jù),默認(rèn)分隔符為制表符("\t")。 詳細(xì)參數(shù)點(diǎn)擊這里
pd.read_excel(filename):從Excel文件導(dǎo)入數(shù)據(jù)
pd.read_sql(query, connection_object):從SQL表/庫(kù)導(dǎo)入數(shù)據(jù)
pd.read_json(json_string):從JSON格式的字符串導(dǎo)入數(shù)據(jù)
pd.read_html(url):解析URL、字符串或者HTML文件,抽取其中的tables表格
pd.read_clipboard():從你的粘貼板獲取內(nèi)容,并傳給read_table()
pd.DataFrame(dict):從字典對(duì)象導(dǎo)入數(shù)據(jù),Key是列名,Value是數(shù)據(jù)
查看、檢查數(shù)據(jù)
- df.head(n):查看DataFrame對(duì)象的前n行
- df.tail(n):查看DataFrame對(duì)象的最后n行
- df.shape():查看行數(shù)和列數(shù)
- df.info():查看索引、數(shù)據(jù)類(lèi)型和內(nèi)存信息
- df.describe():每列的統(tǒng)計(jì)量,個(gè)數(shù)count、平均值mean、方差std、最小值min、中位數(shù)25% 50% 75% 、以及最大值
- s.value_counts(dropna=False):查看Series對(duì)象的唯一值和計(jì)數(shù)
- df.apply(pd.Series.value_counts):查看DataFrame對(duì)象中每一列的唯一值和計(jì)數(shù)
盤(pán)點(diǎn)Pandas 的100個(gè)常用函數(shù)
1.可視化庫(kù):
missingno:
用來(lái)快速可視化缺失值。
- msno.matrix(data, labels=True):無(wú)效矩陣的數(shù)據(jù)密集顯示,白線越多,代表缺失值越多。
- msno.bar(data):列的無(wú)效的簡(jiǎn)單可視化,利用條形圖可以更直觀的看出每個(gè)變量缺失的比例和數(shù)量情況。
- msno.heatmap(data):相關(guān)性熱圖措施無(wú)效的相關(guān)性,一個(gè)變量的存在或不存在如何強(qiáng)烈影響的另一個(gè)的存在。熱度值是1,代表的是,當(dāng)rater1缺失時(shí),rater2也百分之百缺失,表示的是兩個(gè)特征之間的關(guān)系。
seaborn:
要求原始數(shù)據(jù)的輸入類(lèi)型為 pandas 的 Dataframe 或 Numpy 數(shù)組.
- subplots(ncols=列數(shù), nrows=行數(shù)[, figsize=圖片大小, ...]) :繪制子圖一般使用 subplots 和 subplot 函數(shù).
- sns.barplot("X", "y", palette="RdBu_r", data=df) :直方圖顯示。
- sns.distplot(df.sepal_length, bins=20, kde=True, rug=True):課同時(shí)顯示直方圖和密度分布圖。
- sns.pairplot() 點(diǎn)圖,看所有數(shù)據(jù)的一個(gè)聚類(lèi)情況。