閱讀946 返回首頁    go 阿裏雲 go 技術社區[雲棲]


數據分析:讓Python告訴你約會是否可以成功

我是一個婚戀網站的數據分析師,新入職的第二天,接到老板的任務,讓我預測來婚戀網站新注冊的男生&女生是否會約會成功。


如何預測一個新來的男生是否會約會成功呢?這很簡單,隻需要調出一下數據庫中之前注冊網站的會員信息及跟蹤情況,看看和這個新來的男生條件最接近的男生是否約會成功了,那麼就可以大致預估新來的男生是否會約會成功。中國有句老話叫做“近朱者赤,近墨者黑”,正是這個道理。比如下圖,假設我們將男生的條件劃分為三個維度,顏值、背景和收入。藍色點代表約會成功,灰色點代表未約會成功。紅色點代表新來的男生,他和兩個藍色點,一個灰色點最接近,因此點約會成功的可能性是2/3。


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


KNN算法簡介


上述思路所用到的數據挖掘算法為KNN算法, KNN(K NearestNighbor),K最鄰域法屬於惰性算法,其特點是不事先建立全局的判別公式和規則。當新數據需要分類的時候,根據每個樣本和原有樣本的距離,取最近K個樣本點的眾數(Y為分類變量)或者均值(Y為連續變量)作為新樣本的預測值。實做KNN隻需要考慮以下三件事情:


1.     數據的前處理

數據的屬性有Scale的問題,比如收入和年齡的量綱單位不同,則不能簡單的加總來計算距離,需要進行極值的正規化,將輸入變量維度的數據都轉換到【0,1】之間,這樣才能進行距離的計算。計算公式如下:


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


2.     距離的計算

一般使用歐幾裏得距離,勾股定理大家都學過,計算兩點之間的距離,不多說。


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


3.     預測結果的推估

預測過程中我們會同時輸出預測的概率值,同時我們需要去了解幾個指標的含義。

回應率(precision):

捕捉率(recall):

F指標(f1-score):F指標 同時考慮Precision& Recall

 

使用Python進行實做


此部分的思路如下:

  1. 1.    讀入數據集

  2. 2.    描述性分析與探索性分析

  3. 3.    KNN模型建立

  4. 4.    模型的效果評估

數據集描述:此數據集為取自某婚戀網站往期用戶信息庫,含100個觀測,8個變量。

 

加載所需包

%matplotlib inline

import os

import numpy as np

from scipy importstats

import pandas aspd

importsklearn.model_selection as cross_validation 

importmatplotlib.pyplot as plt

import seaborn assns

import math

from scipy importstats,integrate

importstatsmodels.api as sm

 

加載數據並查看前5行

orgData =pd.read_csv('date_data2.csv')

orgData.head()


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


我從數據庫中挑選了收入、魅力值、資產、教育等級變量,並對收入、魅力值和資產進行了分類排序。

 

查看數據集的信息

orgData.info()


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


從上述信息可以看出數據集總共有100個觀測,8個變量。其中浮點型2個,整型6個。還可以看出這個數據集占用了我電腦7k的內存。

 

對數值型變量做描述性統計分析

orgData.describe()


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


Python的語法就是這麼簡潔到令人發指。從上述信息我們可以觀察到各變量的計數、最大值、最小值、平均值等信息。以income為例,平均值為9010元,中位數為7500元。我們猜想是收入被平均了,如何更直觀的看到呢?很簡單,我們畫個直方圖。

 

數據可視化探索

查看收入分布情況 直方圖

sns.distplot(orgData['income'],fit=stats.norm);


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


果然,我們的收入被平均了。其他的數值型變量也可以照同樣方法畫畫看。同時,我們想看看類別型的字段和目標變量的關係。

 

查看教育等級和是否約會成功關係 條形圖

sns.barplot(x='educlass',y='Dated',data=orgData);


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


果然,教育等級越高的人約會成功的概率越高。這麼多分類變量,我如何在一張圖中呈現呢?很簡單,設定麵板數,這裏我們使用分類的計數圖來展現。

 

查看各分類變量和目標變量關係

fig,(axis1,axis2,axis3,axis4) = plt.subplots(1,4,figsize=(15,5))

sns.countplot(x='Dated',hue="educlass", data=orgData, order=[1,0], ax=axis1)

sns.countplot(x='Dated',hue="income_rank", data=orgData, order=[1,0], ax=axis2)

sns.countplot(x='Dated',hue="attractive_rank", data=orgData, order=[1,0], ax=axis3)

sns.countplot(x='Dated',hue="assets_rank", data=orgData, order=[1,0], ax=axis4)


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


可以看出,教育等級,收入,魅力值,資產都和是否約會成功有密切關係。

 

說了這麼多,下麵我們開始用KNN建模,讓機器告訴我們結果吧。

選取自變量和因變量

X = orgData.ix[:,:4]

Y =orgData[['Dated']]

X.head()


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


進行極值的標準化

from sklearnimport preprocessing

min_max_scaler = preprocessing.MinMaxScaler()

X_scaled =min_max_scaler.fit_transform(X)

X_scaled[1:5]


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


此部分返回了自變量進行標準化之後的2~5行值。

 

#劃分訓練集和測試集

train_data,test_data, train_target, test_target = cross_validation.train_test_split(

X_scaled, Y, test_size=0.2, train_size=0.8,random_state=123) 

劃分訓練集和測試集,訓練集用來訓練模型,測試集用來測試模型,訓練集樣本和測試集樣本量比例為8:2.同時設定隨機種子數。

 

建模

fromsklearn.neighbors import KNeighborsClassifier

model =KNeighborsClassifier(n_neighbors=3)  # 默認歐氏距離

model.fit(train_data,train_target.values.flatten())

test_est =model.predict(test_data)

我們首先從導入了KNN分類器,分類模型的k值設置為3,然後用模型去訓練訓練集,並且用測試數據集來測試模型結果,輸出到test_est對象中。

 

模型評估

import sklearn.metricsas metrics

print(metrics.confusion_matrix(test_target,test_est, labels=[0, 1]))  # 混淆矩陣

print(metrics.classification_report(test_target,test_est))


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


可以看出,模型的命中率和回應率均值都達到了90%。F指標為0.9

 

好了,模型的結果還勉強滿意,美滋滋,做個報告去和老板交差了。

 

【後話】當然,這裏麵隻是用了一個簡單的數據集去實操了一下KNN的做法,操作和語法都比較簡單易用理解,同時遍曆了一下我們數據挖掘的流程,相應的知識及後續的知識沒有做過多的展開,比如前端的數據如何清洗,KNN中K值如何設定和交叉驗證,使用樸素貝葉斯預測模型的準確率,特征選擇,模型融合等。希望大家能有所收獲。

 

~ From CDA學員

添加老師 微信 cdagood領取價值2999元數據分析資料!!

最後更新:2017-09-22 15:03:57

  上一篇:go  怎樣充分利用安全預算
  下一篇:go  氣象大數據分析助力農業生產