如何用 Python 和 Tensorflow 2.0 神經(jīng)網(wǎng)絡(luò)分類表格數(shù)據(jù)?

以客戶流失數(shù)據(jù)為例叹螟,看 Tensorflow 2.0 版本如何幫助我們快速構(gòu)建表格(結(jié)構(gòu)化)數(shù)據(jù)的神經(jīng)網(wǎng)絡(luò)分類模型鹃骂。

變化

表格數(shù)據(jù),你應(yīng)該并不陌生罢绽。畢竟畏线, Excel 這東西在咱們平時(shí)的工作和學(xué)習(xí)中,還是挺常見的良价。

在之前的教程里寝殴,我為你分享過(guò)蒿叠,如何利用深度神經(jīng)網(wǎng)絡(luò),鎖定即將流失的客戶蚣常。里面用到的市咽,就是這樣的表格數(shù)據(jù)。

時(shí)間過(guò)得真快拢锹,距離寫作那篇教程载萌,已經(jīng)一年半了辩棒。

這段時(shí)間里,出現(xiàn)了2個(gè)重要的變化谷醉,使我覺得有必要重新來(lái)跟你談?wù)勥@個(gè)話題。

這兩個(gè)變化分別是:

首先冈闭,tflearn 框架的開發(fā)已經(jīng)不再活躍孤紧。

tflearn 是當(dāng)時(shí)教程中我們使用的高階深度學(xué)習(xí)框架,它基于 Tensorflow 之上拒秘,包裹了大量的細(xì)節(jié)号显,讓用戶可以非常方便地搭建自己的模型。

但是躺酒,由于 Tensorflow 選擇擁抱了它的競(jìng)爭(zhēng)者 Keras 押蚤,導(dǎo)致后者的競(jìng)爭(zhēng)優(yōu)勢(shì)凸顯。

對(duì)比二者獲得的星數(shù)羹应,已經(jīng)不在同一量級(jí)揽碘。

觀察更新時(shí)間,tflearn 已經(jīng)幾個(gè)月沒有動(dòng)靜园匹;而 Keras 幾個(gè)小時(shí)之前雳刺,還有更新。

我們選擇免費(fèi)開源框架裸违,一定要使用開發(fā)活躍掖桦、社區(qū)支持完善的。只有這樣供汛,遇到問(wèn)題才能更低成本枪汪、高效率地解決。

看過(guò)我的《Python編程遇問(wèn)題怔昨,文科生怎么辦雀久?》一文之后,你對(duì)上述結(jié)論趁舀,應(yīng)該不陌生赖捌。

另一項(xiàng)新變化,是 Tensorflow 發(fā)布了 2.0 版本矮烹。

相對(duì) 1.X 版本越庇,這個(gè)大版本的變化奋隶,我在《如何用 Python 和 BERT 做中文文本二元分類?》一文中悦荒,已經(jīng)粗略地為你介紹過(guò)了唯欣。簡(jiǎn)要提煉一下,就是:

之前的版本搬味,以計(jì)算圖為中心境氢。開發(fā)者需要為這張圖服務(wù)。因此碰纬,引入了大量的不必要術(shù)語(yǔ)萍聊。新版本以人為中心,用戶撰寫高階的簡(jiǎn)潔語(yǔ)句悦析,框架自動(dòng)將其轉(zhuǎn)化為對(duì)應(yīng)的計(jì)算圖寿桨。

之前的版本,缺少目前競(jìng)爭(zhēng)框架(如 PyTorch 等)包含的新特性强戴。例如計(jì)算圖動(dòng)態(tài)化亭螟、運(yùn)行中調(diào)試功能等。

但對(duì)普通開發(fā)者來(lái)說(shuō)骑歹,最為重要的是预烙,官方文檔和教程變得對(duì)用戶友好許多。不僅寫得清晰簡(jiǎn)明道媚,更靠著 Google Colab 的支持扁掸,全都能一鍵運(yùn)行。我嘗試了 2.0 版本的一些教程樣例最域,確實(shí)感覺大不一樣了谴分。

其實(shí)你可能會(huì)覺得奇怪—— Tensorflow 大張旗鼓宣傳的大版本改進(jìn),其實(shí)也無(wú)非就是向著 PyTorch 早就有的功能靠攏而已嘛镀脂。那我干脆去學(xué) PyTorch 好了牺蹄!

如果我們只說(shuō)道理,這其實(shí)沒錯(cuò)狗热。然而钞馁,還是前面那個(gè)論斷,一個(gè)框架好不好匿刮,主要看是否開發(fā)活躍社區(qū)支持完善探颈。這就是一個(gè)自證預(yù)言熟丸。一旦人們都覺得 Tensorflow 好用,那么 Tensorflow 就會(huì)更好用伪节。因?yàn)闀?huì)有更多的人參與進(jìn)來(lái)光羞,幫助反饋和改進(jìn)绩鸣。

看看現(xiàn)在 PyTorch 的 Github 頁(yè)面。

受關(guān)注度纱兑,確實(shí)已經(jīng)很高了呀闻。

然而你再看看 Tensorflow 的。

至少在目前潜慎,二者根本不在一個(gè)數(shù)量級(jí)捡多。

Tensorflow 的威力,不只在于本身構(gòu)建和訓(xùn)練模型是不是好用铐炫。那其實(shí)只是深度學(xué)習(xí)中垒手,非常小的一個(gè)環(huán)節(jié)。不信倒信?你在下圖里找找看科贬。

真正的問(wèn)題,在于是否有完整的生態(tài)環(huán)境支持鳖悠。其中的邏輯榜掌,我在《學(xué) Python ,能提升你的競(jìng)爭(zhēng)力嗎乘综?》一文中唐责,已經(jīng)為你詳細(xì)分析過(guò)了。

而 Tensorflow 瘾带,早就通過(guò)一系列的布局鼠哥,使得其訓(xùn)練模型可以直接快速部署,最快速度鋪開看政,幫助開發(fā)者占領(lǐng)市場(chǎng)先機(jī)朴恳。

如果你使用 PyTorch ,那么這樣的系統(tǒng)允蚣,是相對(duì)不完善的于颖。當(dāng)然你可以在 PyTorch 中訓(xùn)練,然后轉(zhuǎn)換并且部署到 Tensorflow 里面嚷兔。畢竟三巨頭達(dá)成了協(xié)議森渐,標(biāo)準(zhǔn)開放,這樣做從技術(shù)上并不困難冒晰。

但是同衣,人的認(rèn)知帶寬,是非常有限的壶运。大部分人耐齐,是不會(huì)選擇在兩個(gè)框架甚至生態(tài)系統(tǒng)之間折騰的。這就是路徑依賴

所以埠况,別左顧右盼了耸携,認(rèn)認(rèn)真真學(xué) Tensorflow 2.0 吧。

這篇文章里面辕翰,我給你介紹夺衍,如何用 Tensorflow 2.0 ,來(lái)訓(xùn)練神經(jīng)網(wǎng)絡(luò)喜命,對(duì)用戶流失數(shù)據(jù)建立分類模型沟沙,從而可以幫你見微知著,洞察風(fēng)險(xiǎn)渊抄,提前做好干預(yù)和防范尝胆。

數(shù)據(jù)

你手里擁有的,是一份銀行歐洲區(qū)客戶的數(shù)據(jù)护桦,共有10000條記錄含衔。客戶主要分布在法國(guó)二庵、德國(guó)和西班牙贪染。

數(shù)據(jù)來(lái)自于匿名化處理后的真實(shí)數(shù)據(jù)集,下載自 superdatascience 官網(wǎng)催享。

從表格中杭隙,可以讀取的信息,包括客戶們的年齡因妙、性別痰憎、信用分?jǐn)?shù)、辦卡信息等攀涵∠吃牛客戶是否已流失的信息在最后一列(Exited)。

這份數(shù)據(jù)以故,我已經(jīng)上傳到了這個(gè)地址蜗细,你可以下載,并且用 Excel 查看怒详。

環(huán)境

本文的配套源代碼炉媒,我放在了這個(gè) Github 項(xiàng)目中。請(qǐng)你點(diǎn)擊這個(gè)鏈接http://t.cn/EXffmgX)訪問(wèn)昆烁。

如果你對(duì)我的教程滿意吊骤,歡迎在頁(yè)面右上方的 Star 上點(diǎn)擊一下,幫我加一顆星善玫。謝謝水援!

注意這個(gè)頁(yè)面的中央密强,有個(gè)按鈕茅郎,寫著“在 Colab 打開” (Open in Colab)蜗元。請(qǐng)你點(diǎn)擊它。

然后系冗,Google Colab 就會(huì)自動(dòng)開啟奕扣。

我建議你點(diǎn)一下上圖中紅色圈出的 “COPY TO DRIVE” 按鈕。這樣就可以先把它在你自己的 Google Drive 中存好掌敬,以便使用和回顧惯豆。

Colab 為你提供了全套的運(yùn)行環(huán)境。你只需要依次執(zhí)行代碼奔害,就可以復(fù)現(xiàn)本教程的運(yùn)行結(jié)果了楷兽。

如果你對(duì) Google Colab 不熟悉,沒關(guān)系华临。我這里有一篇教程芯杀,專門講解 Google Colab 的特點(diǎn)與使用方式。

為了你能夠更為深入地學(xué)習(xí)與了解代碼雅潭,我建議你在 Google Colab 中開啟一個(gè)全新的 Notebook 揭厚,并且根據(jù)下文,依次輸入代碼并運(yùn)行扶供。在此過(guò)程中筛圆,充分理解代碼的含義。

這種看似笨拙的方式椿浓,其實(shí)是學(xué)習(xí)的有效路徑太援。

代碼

首先,我們下載客戶流失數(shù)據(jù)集扳碍。

!wget https://raw.githubusercontent.com/wshuyi/demo-customer-churn-ann/master/customer_churn.csv

載入 Pandas 數(shù)據(jù)分析包提岔。

import pandas as pd

利用 read_csv 函數(shù),讀取 csv 格式數(shù)據(jù)到 Pandas 數(shù)據(jù)框左腔。

df = pd.read_csv('customer_churn.csv')

我們來(lái)看看前幾行顯示結(jié)果:

df.head()

顯示正常唧垦。下面看看一共都有哪些列。

df.columns

我們對(duì)所有列液样,一一甄別振亮。

  • RowNumber:行號(hào),這個(gè)對(duì)于模型沒用鞭莽,忽略
  • CustomerID:用戶編號(hào)坊秸,這個(gè)是順序發(fā)放的,忽略
  • Surname:用戶姓名澎怒,對(duì)流失沒有影響褒搔,忽略
  • CreditScore:信用分?jǐn)?shù),這個(gè)很重要,保留
  • Geography:用戶所在國(guó)家/地區(qū)星瘾,這個(gè)有影響走孽,保留
  • Gender:用戶性別,可能有影響琳状,保留
  • Age:年齡磕瓷,影響很大,年輕人更容易切換銀行念逞,保留
  • Tenure:當(dāng)了本銀行多少年用戶困食,很重要,保留
  • Balance:存貸款情況翎承,很重要硕盹,保留
  • NumOfProducts:使用產(chǎn)品數(shù)量,很重要叨咖,保留
  • HasCrCard:是否有本行信用卡瘩例,很重要,保留
  • IsActiveMember:是否活躍用戶芒澜,很重要仰剿,保留
  • EstimatedSalary:估計(jì)收入,很重要痴晦,保留
  • Exited:是否已流失南吮,這將作為我們的標(biāo)簽數(shù)據(jù)

確定了不同列的含義和價(jià)值,下面我們處理起來(lái)誊酌,就得心應(yīng)手了部凑。

數(shù)據(jù)有了,我們來(lái)調(diào)入深度學(xué)習(xí)框架碧浊。

因?yàn)楸敬挝覀冃枰褂?Tensorflow 2.0 涂邀,而寫作本文時(shí),該框架版本尚處于 Alpha 階段箱锐,因此 Google Colab 默認(rèn)使用的比勉,還是 Tensorflow 1.X 版本。要用 2.0 版驹止,便需要顯式安裝浩聋。

!pip install -q tensorflow==2.0.0-alpha0

安裝框架后,我們載入下述模塊和函數(shù)臊恋,后文會(huì)用到衣洁。

import numpy as np
import tensorflow as tf
from tensorflow import keras
from sklearn.model_selection import train_test_split
from tensorflow import feature_column

這里,我們?cè)O(shè)定一些隨機(jī)種子值抖仅。這主要是為了保證結(jié)果可復(fù)現(xiàn)坊夫,也就是在你那邊的運(yùn)行結(jié)果砖第,和我這里盡量保持一致。這樣我們觀察和討論問(wèn)題环凿,會(huì)更方便梧兼。

首先是 Tensorflow 中的隨機(jī)種子取值,設(shè)定為 1 拷邢。

tf.random.set_seed(1)

然后我們來(lái)分割數(shù)據(jù)袱院。這里使用的是 Scikit-learn 中的 train_test_split 函數(shù)屎慢。指定分割比例即可瞭稼。

我們先按照 80:20 的比例,把總體數(shù)據(jù)分成訓(xùn)練集測(cè)試集腻惠。

train, test = train_test_split(df, test_size=0.2, random_state=1)

然后环肘,再把現(xiàn)有訓(xùn)練集的數(shù)據(jù),按照 80:20 的比例集灌,分成最終的訓(xùn)練集悔雹,以及驗(yàn)證集

train, valid = train_test_split(train, test_size=0.2, random_state=1)

這里欣喧,我們都指定了 random_state 腌零,為的是保證咱們隨機(jī)分割的結(jié)果一致。

我們看看幾個(gè)不同集合的長(zhǎng)度唆阿。

print(len(train))
print(len(valid))
print(len(test))

驗(yàn)證無(wú)誤益涧。下面我們來(lái)做特征工程(feature engineering)。

因?yàn)槲覀兪褂玫氖潜砀駭?shù)據(jù)(tabular data)驯鳖,屬于結(jié)構(gòu)化數(shù)據(jù)闲询。因此特征工程相對(duì)簡(jiǎn)單一些。

先初始化一個(gè)空的特征列表浅辙。

feature_columns = []

然后扭弧,我們指定,哪些列是數(shù)值型數(shù)據(jù)(numeric data)记舆。

numeric_columns = ['CreditScore', 'Age', 'Tenure', 'Balance', 'NumOfProducts', 'EstimatedSalary']

可見鸽捻,包含了以下列:

  • CreditScore:信用分?jǐn)?shù)
  • Age:年齡
  • Tenure:當(dāng)了本銀行多少年用戶
  • Balance:存貸款情況
  • NumOfProducts:使用產(chǎn)品數(shù)量
  • EstimatedSalary:估計(jì)收入

對(duì)于這些列,只需要直接指定類型泽腮,加入咱們的特征列表就好御蒲。

for header in numeric_columns:
  feature_columns.append(feature_column.numeric_column(header))

下面是比較講究技巧的部分了,就是類別數(shù)據(jù)盛正。

先看看都有哪些列:

categorical_columns = ['Geography', 'Gender', 'HasCrCard', 'IsActiveMember']
  • Geography:用戶所在國(guó)家/地區(qū)
  • Gender:用戶性別
  • HasCrCard:是否有本行信用卡
  • IsActiveMember:是否活躍用戶

類別數(shù)據(jù)的特點(diǎn)删咱,在于不能直接用數(shù)字描述。例如 Geography 包含了國(guó)家/地區(qū)名稱豪筝。如果你把法國(guó)指定為1痰滋, 德國(guó)指定為2摘能,電腦可能自作聰明,認(rèn)為“德國(guó)”是“法國(guó)”的2倍敲街,或者团搞,“德國(guó)”等于“法國(guó)”加1。這顯然不是我們想要表達(dá)的多艇。

所以我這里編了一個(gè)函數(shù)逻恐,把一個(gè)類別列名輸入進(jìn)去,讓 Tensorflow 幫我們將其轉(zhuǎn)換成它可以識(shí)別的類別形式峻黍。例如把法國(guó)按照 [0, 0, 1]复隆,德國(guó)按照 [0, 1, 0] 來(lái)表示。這樣就不會(huì)有數(shù)值意義上的歧義了姆涩。

def get_one_hot_from_categorical(colname):
  categorical = feature_column.categorical_column_with_vocabulary_list(colname, train[colname].unique().tolist())
  return feature_column.indicator_column(categorical)

我們嘗試輸入 Geography 一項(xiàng)挽拂,測(cè)試一下函數(shù)工作是否正常。

geography = get_one_hot_from_categorical('Geography'); geography

觀察結(jié)果骨饿,測(cè)試通過(guò)亏栈。

下面我們放心大膽地把所有類別數(shù)據(jù)列都在函數(shù)里面跑一遍,并且把結(jié)果加入到特征列表中宏赘。

for col in categorical_columns:
  feature_columns.append(get_one_hot_from_categorical(col))

看看此時(shí)的特征列表內(nèi)容:

feature_columns

6個(gè)數(shù)值類型绒北,4個(gè)類別類型,都沒問(wèn)題了察署。

下面該構(gòu)造模型了闷游。

我們直接采用 Tensorflow 2.0 鼓勵(lì)開發(fā)者使用的 Keras 高級(jí) API 來(lái)拼搭一個(gè)簡(jiǎn)單的深度神經(jīng)網(wǎng)絡(luò)模型。

from tensorflow.keras import layers

我們把剛剛整理好的特征列表箕母,利用 DenseFeatures 層來(lái)表示储藐。把這樣的一個(gè)初始層,作為模型的整體輸入層嘶是。

feature_layer = layers.DenseFeatures(feature_columns); feature_layer

下面钙勃,我們順序疊放兩個(gè)中間層,分別包含200個(gè)聂喇,以及100個(gè)神經(jīng)元辖源。這兩層的激活函數(shù),我們都采用 relu 希太。

relu 函數(shù)大概長(zhǎng)這個(gè)樣子:

model = keras.Sequential([
  feature_layer,
  layers.Dense(200, activation='relu'),
  layers.Dense(100, activation='relu'),
  layers.Dense(1, activation='sigmoid')
])

我們希望輸出結(jié)果是0或者1克饶,所以這一層只需要1個(gè)神經(jīng)元,而且采用的是 sigmoid 作為激活函數(shù)誊辉。

sigmoid 函數(shù)的長(zhǎng)相是這樣的:

模型搭建好了矾湃,下面我們指定3個(gè)重要參數(shù),編譯模型堕澄。

model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['accuracy'])

這里邀跃,我們選擇優(yōu)化器為 adam 霉咨。

因?yàn)樵u(píng)判二元分類效果,所以損失函數(shù)選的是 binary_crossentropy拍屑。

至于效果指標(biāo)途戒,我們使用的是準(zhǔn)確率(accuracy)。

模型編譯好之后僵驰。萬(wàn)事俱備喷斋,只差數(shù)據(jù)了。

你可能納悶蒜茴,一上來(lái)不就已經(jīng)把訓(xùn)練星爪、驗(yàn)證和測(cè)試集分好了嗎?

沒錯(cuò)矮男,但那只是原始數(shù)據(jù)移必。我們模型需要接收的,是數(shù)據(jù)流毡鉴。

在訓(xùn)練和驗(yàn)證過(guò)程中,數(shù)據(jù)都不是一次性灌入模型的秒赤。而是一批次一批次分別載入猪瞬。每一個(gè)批次,稱作一個(gè) batch入篮;相應(yīng)地陈瘦,批次大小,叫做 batch_size 潮售。

為了方便咱們把 Pandas 數(shù)據(jù)框中的原始數(shù)據(jù)轉(zhuǎn)換成數(shù)據(jù)流痊项。我這里編寫了一個(gè)函數(shù)。

def df_to_tfdata(df, shuffle=True, bs=32):
  df = df.copy()
  labels = df.pop('Exited')
  ds = tf.data.Dataset.from_tensor_slices((dict(df), labels))
  if shuffle:
    ds = ds.shuffle(buffer_size=len(df), seed=1)
  ds = ds.batch(bs)
  return ds

這里首先是把數(shù)據(jù)中的標(biāo)記拆分出來(lái)酥诽。然后根據(jù)把數(shù)據(jù)讀入到 ds 中鞍泉。根據(jù)是否是訓(xùn)練集,我們指定要不要需要打亂數(shù)據(jù)順序肮帐。然后咖驮,依據(jù) batch_size 的大小,設(shè)定批次训枢。這樣托修,數(shù)據(jù)框就變成了神經(jīng)網(wǎng)絡(luò)模型喜聞樂見的數(shù)據(jù)流

train_ds = df_to_tfdata(train)
valid_ds = df_to_tfdata(valid, shuffle=False)
test_ds = df_to_tfdata(test, shuffle=False)

這里恒界,只有訓(xùn)練集打亂順序睦刃。因?yàn)槲覀兿M?yàn)證和測(cè)試集一直保持一致。只有這樣十酣,不同參數(shù)下涩拙,對(duì)比的結(jié)果才有顯著意義枣宫。

有了模型架構(gòu),也有了數(shù)據(jù)吃环,我們把訓(xùn)練集和驗(yàn)證集扔進(jìn)去也颤,讓模型嘗試擬合。這里指定了郁轻,跑5個(gè)完整輪次(epochs)翅娶。

model.fit(train_ds,
          validation_data=valid_ds,
          epochs=5)

你會(huì)看到,最終的驗(yàn)證集準(zhǔn)確率接近80%好唯。

我們打印一下模型結(jié)構(gòu):

model.summary()

雖然我們的模型非常簡(jiǎn)單竭沫,卻也依然包含了23401個(gè)參數(shù)。

下面骑篙,我們把測(cè)試集放入模型中蜕提,看看模型效果如何。

model.evaluate(test_ds)

依然靶端,準(zhǔn)確率接近80%谎势。

還不錯(cuò)吧?

……

真的嗎杨名?

疑惑

如果你觀察很仔細(xì)脏榆,可能剛才已經(jīng)注意到了一個(gè)很奇特的現(xiàn)象:

訓(xùn)練的過(guò)程中,除了第一個(gè)輪次外台谍,其余4個(gè)輪次的這幾項(xiàng)重要指標(biāo)居然都沒變须喂!

它們包括:

  • 訓(xùn)練集損失
  • 訓(xùn)練集準(zhǔn)確率
  • 驗(yàn)證集損失
  • 驗(yàn)證集準(zhǔn)確率

所謂機(jī)器學(xué)習(xí),就是不斷迭代改進(jìn)啊趁蕊。如果每一輪下來(lái)坞生,結(jié)果都一模一樣,這難道不奇怪嗎掷伙?難道沒問(wèn)題嗎是己?

我希望你,能夠像偵探一樣炎咖,揪住這個(gè)可疑的線索赃泡,深入挖掘進(jìn)去。

這里乘盼,我給你個(gè)提示升熊。

看一個(gè)分類模型的好壞,不能只看準(zhǔn)確率(accuracy)绸栅。對(duì)于二元分類問(wèn)題级野,你可以關(guān)注一下 f1 score,以及混淆矩陣(confusion matrix)。

如果你驗(yàn)證了上述兩個(gè)指標(biāo)蓖柔,那么你應(yīng)該會(huì)發(fā)現(xiàn)真正的問(wèn)題是什么辰企。

下一步要窮究的,是問(wèn)題產(chǎn)生的原因况鸣。

回顧一下咱們的整個(gè)兒過(guò)程牢贸,好像都很清晰明了,符合邏輯啊镐捧。究竟哪里出了問(wèn)題呢潜索?

如果你一眼就看出了問(wèn)題。恭喜你懂酱,你對(duì)深度學(xué)習(xí)已經(jīng)有感覺了竹习。那么我繼續(xù)追問(wèn)你,該怎么解決這個(gè)問(wèn)題呢列牺?

歡迎你把思考后的答案在留言區(qū)告訴我整陌。

對(duì)于第一名全部回答正確上述問(wèn)題的讀者,我會(huì)邀請(qǐng)你作為嘉賓瞎领,免費(fèi)(原價(jià)199元)加入我本年度的知識(shí)星球泌辫。當(dāng)然,前提是你愿意默刚。

小結(jié)

希望通過(guò)本文的學(xué)習(xí)甥郑,你已掌握了以下知識(shí)點(diǎn):

  1. Tensorflow 2.0 的安裝與使用;
  2. 表格式數(shù)據(jù)的神經(jīng)網(wǎng)絡(luò)分類模型構(gòu)建荤西;
  3. 特征工程的基本流程;
  4. 數(shù)據(jù)集合的隨機(jī)分割與利用種子數(shù)值保持一致伍俘;
  5. 數(shù)值型數(shù)據(jù)列與類別型數(shù)據(jù)列的分別處理方式邪锌;
  6. Keras 高階 API 的模型搭建與訓(xùn)練;
  7. 數(shù)據(jù)框轉(zhuǎn)化為 Tensorflow 數(shù)據(jù)流癌瘾;
  8. 模型效果的驗(yàn)證觅丰;
  9. 缺失的一環(huán),也即本文疑點(diǎn)產(chǎn)生的原因妨退,以及正確處理方法妇萄。

希望本教程對(duì)于你處理表格型數(shù)據(jù)分類任務(wù),能有幫助咬荷。

祝深度學(xué)習(xí)愉快冠句!

延伸閱讀

你可能也會(huì)對(duì)以下話題感興趣。點(diǎn)擊鏈接就可以查看幸乒。

喜歡請(qǐng)點(diǎn)贊和打賞丐重。還可以微信關(guān)注和置頂我的公眾號(hào)“玉樹芝蘭”(nkwangshuyi)

如果你對(duì) Python 與數(shù)據(jù)科學(xué)感興趣杆查,不妨閱讀我的系列教程索引貼《如何高效入門數(shù)據(jù)科學(xué)扮惦?》,里面還有更多的有趣問(wèn)題及解法亲桦。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末崖蜜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子烙肺,更是在濱河造成了極大的恐慌纳猪,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桃笙,死亡現(xiàn)場(chǎng)離奇詭異氏堤,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)搏明,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門鼠锈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人星著,你說(shuō)我怎么就攤上這事购笆。” “怎么了虚循?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵同欠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我横缔,道長(zhǎng)铺遂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任茎刚,我火速辦了婚禮襟锐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘膛锭。我一直安慰自己粮坞,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布初狰。 她就那樣靜靜地躺著莫杈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪跷究。 梳的紋絲不亂的頭發(fā)上姓迅,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼丁存。 笑死肩杈,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的解寝。 我是一名探鬼主播扩然,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼聋伦!你這毒婦竟也來(lái)了夫偶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤觉增,失蹤者是張志新(化名)和其女友劉穎兵拢,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逾礁,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡说铃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嘹履。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腻扇。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖砾嫉,靈堂內(nèi)的尸體忽然破棺而出幼苛,到底是詐尸還是另有隱情,我是刑警寧澤焕刮,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布舶沿,位于F島的核電站,受9級(jí)特大地震影響配并,放射性物質(zhì)發(fā)生泄漏暑椰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一荐绝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧避消,春花似錦低滩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至纱意,卻和暖如春婶溯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工迄委, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留褐筛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓叙身,卻偏偏與公主長(zhǎng)得像渔扎,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子信轿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容