数据挖掘实战—餐饮行业的数据挖掘之数据预处理
文章目錄
- 引言
- 一、數據清洗
- 1.缺失值處理
- 1.1 拉格朗日插值法
- 1.2牛頓差值法
- 2.異常值的處理
- 二、數據集成
- 1.實體識別
- 2.冗余屬性識別
- 3.數據變換
- 3.1 簡單函數變換
- 3.2 規范化
- 3.2.1 最小-最大規范化
- 3.2.2 零-均值規范化(標準化)
- 3.2.3 小數定標規范化
- 3.3 連續屬性離散化
- 3.3.1 離散化方法
- 4.屬性構造
- 5.小波變換
- 5.1 基于小波變換的特征提取方法
- 5.2 基于小波變換的多尺度空間能量分布特征提取方法
- 三、數據歸約
- 1.屬性歸約
- 1.1 前向挑選、后向挑選、雙向挑選
- 1.2 主成分分析
- 2.數值歸約
- 2.1 直方圖
- 2.2 聚類
- 2.3 抽樣
- 2.4 參數回歸
- 本文參考《python數據分析與挖掘實戰》
- 數據集鏈接,密碼1234
- 《python數據分析與挖掘實戰》pdf鏈接,密碼1234
- 數據挖掘實戰—餐飲行業的數據挖掘之數據探索(EDA)
引言
??數據挖掘過程中,海量的數據中存在缺失、異常、不一致的數據,數據的質量決定模型的質量,所以進行數據清洗非常重要。數據預處理包括數據清洗、數據集成、數據變換和數據歸約
一、數據清洗
??數據清洗主要是刪除原始數據中的無關數據、重復數據、平滑噪聲數據,刪選掉與挖掘主題無關的數據,處理缺失值、異常值等
1.缺失值處理
??處理缺失值的方法可分為3類:刪除記錄、數據插補和不處理。其中常用的數據插補方法有
刪除記錄: 如果簡單刪除小部分記錄就可以達到既定目標,那么這種方法是最有效的,但容易造成資源的浪費,丟失掉大量隱藏在這些記錄中的信息,尤其是數據很少的情況下
不處理: XGBoost模型可以直接對缺失值進行處理
數據插補: 重點介紹拉格朗日插值法和牛頓差值法,在進行插值前需要對數據的異常值進行檢測,根據業務邏輯將全部異常值或者部分異常值定義為空缺值,然后進行插補
1.1 拉格朗日插值法
??拉格朗日插值法當插值節點增減時,插值多項式會發生變化。牛頓差值法改進了它的缺點。以銷量數據為例,運用拉格朗日插值法補充缺失值
import numpy as np import pandas as pd import matplotlib.pyplot as plt from scipy.interpolate import lagrangecat_sale = pd.read_excel('data/catering_sale.xls') cat_sale.drop('日期', axis=1, inplace=True)# 過濾異常值,并置為空值 cat_sale['銷量'][(cat_sale['銷量'] < 400) | (cat_sale['銷量'] > 5000)] = np.NAN# 自定義列向量插值函數 def ployinterp_columns(s, n, k=4):if n < k:y = s[list(range(0, n)) + list(range(n + 1, n + k + 1))]elif n > len(s) - k - 1:y = s[list(range(n - k, n)) + list(range(n + 1, len(s)))]else:y = s[list(range(n - k, n)) + list(range(n + 1, n + k + 1))] # 取空值處的前后3個數y = y[y.notnull()] # 剔除空值return lagrange(y.index, list(y))(n) # 插值并返回插值結果# 逐個判斷元素是否需要插值 for i in cat_sale.columns:for j in range(len(cat_sale)):if (cat_sale[i].isnull())[j]: # 如果為空則插值print(ployinterp_columns(cat_sale[i], j))cat_sale[i][j] = ployinterp_columns(cat_sale[i], j)cat_sale.to_csv('sales.csv') # 輸出結果,寫入文件1.2牛頓差值法
??牛頓插值法與拉格朗日插值法相比,具有承襲性和易于變動節點的特點
import numpy as np import pandas as pdcat_sale = pd.read_excel('data/catering_sale.xls') cat_sale.drop('日期', axis=1, inplace=True)# 過濾異常值,并置為空值 cat_sale['銷量'][(cat_sale['銷量'] < 400) | (cat_sale['銷量'] > 5000)] = np.NAN# 分別定義求插商與求w的函數 def cal_f(x, y):"""計算插商"""f0 = np.zeros((len(x), len(y))) # 定義一個存儲插商的數組for k in range(len(y) + 1): # 遍歷列for i in range(k, len(x)): # 遍歷行if k == 0:f0[i, k] = y[i]else:f0[i, k] = (f0[i, k - 1] - f0[i - 1, k - 1]) / (x[i] - x[i - 1])print('差商表', '\n', f0)return f0def newton(x, y, x_j):"""牛頓差值多項式"""f0 = cal_f(x, y) # 計算插商f0 = f0.diagonal()# 與w相乘f1 = 0for i in range(len(f0)):s = 1k = 0while k < i:s = s * (x_j - x[k])k += 1f1 = f1 + f0[i] * sreturn f1# 自定義列向量插值函數 def ployinterp_columns(s, n, x_j, k=2):if n < k:y = s[list(range(0, n)) + list(range(n + 1, n + k + 1))]elif n > len(s) - k - 1:y = s[list(range(n - k, n)) + list(range(n + 1, len(s)))]else:y = s[list(range(n - k, n)) + list(range(n + 1, n + k + 1))] # 取空值處的前后5個數y = y[y.notnull()] # 剔除空值return newton(y.index, list(y), x_j) # 插值并返回插值結果for i in cat_sale.columns:for j in range(len(cat_sale)):if (cat_sale[i].isnull())[j]:x_j = cat_sale.index[j]print(ployinterp_columns(cat_sale[i], j, x_j))cat_sale[i][j] = ployinterp_columns(cat_sale[i], j, x_j)cat_sale.to_excel('saless.xls')2.異常值的處理
??數據預處理中,異常值是否剔除需要視情況而定,因為有些異常值可能蘊含著有用的信息。
??很多情況下,要先分析異常值出現的可能原因,在判斷異常值是否應該舍棄。如果是正確的數據,可以直接在具有異常值的數據集上進行挖掘建模。
二、數據集成
??數據挖掘需要的數據往往分布在不同的數據源中,數據集成就是將多個數據源合并存放在一個一致的數據存儲位置中的過程。數據集成時,多個數據源的現實世界實體表達形式時有可能是不匹配的,常出現實體識別問題和屬性冗余問題,從而將源數據在最底層上加以轉換、提煉和集成。
1.實體識別
2.冗余屬性識別
3.數據變換
??數據變換主要是對數據進行規范化處理,將數據轉換成“適當的”形式,以適用于挖掘任務及算法的需要
3.1 簡單函數變換
??簡單函數變換是對原始數據進行某些數學函數變換,如:平方、開方、取對數、差分運算。簡單的函數變換常用于將不具有正態分布的數據變換成具有正態分布的數據;在時間序列分析中,有時,簡單的對數變換或者差分運算就可以將非平穩序列變換為平穩序列。在數據挖掘中,如個人年收入是10萬到10億元,這是一個很大的區間,可以使用對數變換來對區間進行壓縮。
3.2 規范化
??不同評價指標往往具有不同的量綱,數值間的差別很大,不進行處理可能會影響數據分析的結果。為了消除指標之間量綱和取值范圍的影響,需要進行標準化處理。將數據按照比例進行縮放,使之落入一個特定區域。數據規范化對基于距離的挖掘算法尤為重要。
3.2.1 最小-最大規范化
3.2.2 零-均值規范化(標準化)
3.2.3 小數定標規范化
3.3 連續屬性離散化
??一些數據挖掘算法,特別是某些分類算法,如ID3算法,要求數據是分類屬性形式。這樣就需要將連續屬性變換為分類屬性。
??連續屬性離散化指的是在數據取值范圍內設定若干個離散的劃分點,將取值范圍劃分為一些離散化的區間,最后用不同的符號或整數值代表落在每個子區間中的數據值。離散化涉及兩個任務:
3.3.1 離散化方法
??常用的離散化方法有等寬法、等頻法和(一維)聚類
等寬法
含義:將屬性的值域分成具有相同寬度的區間,區間的個數由數據本身的特點決定或者用戶指定
缺點:等寬法由于對離群點比較敏感,傾向于不均勻的把屬性值分布在各個區間。有些區間包含很多數據,而另外一些區間的數據極少,這樣會嚴重損壞建立的決策模型。
pandas中的cut函數實現了等距分箱
等頻法
含義:將相同數量的記錄放進每個區間里
缺點:雖然避免了數據不均勻,但是卻有可能將相同的數據值分在不同的區間內,以滿足每個區間中有相同的數據個數。
基于聚類分析的方法
含義:首先將連續屬性的值用聚類算法(如K-means算法)進行聚類,然后將聚類得到的簇進行處理,合并到一個簇的連續屬性值做同一標記。簇的個數可以用戶指定,或者是使用輪廓系數silhouette_score來尋找最佳的簇的個數。
#!usr/bin/env python # -*- coding:utf-8 -*- """ @author: admin @file: 連續屬性離散化.py @time: 2021/03/30 @desc: """ import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.cluster import KMeansdata = pd.read_excel('data/discretization_data.xls') # data = data['肝氣郁結證型系數'].copy() k = 4 # 4分箱 """ 1.等寬離散化 """ d1 = pd.cut(data['肝氣郁結證型系數'], k, labels=range(k)) # data['等寬'] = d1""" 2.等頻離散化 """ d2 = pd.qcut(data['肝氣郁結證型系數'], k, labels=range(k)) # data['等頻'] = d2""" 3.聚類法 """ kmodel = KMeans(n_clusters=k) kmodel.fit(np.array(data['肝氣郁結證型系數']).reshape(len(data), 1)) # 聚類中心并排序 c = pd.DataFrame(kmodel.cluster_centers_).sort_values(by=0) # 相鄰聚類中心兩項求中點,作為邊界點 w = c.rolling(2).mean() # 取出NaN w = w.dropna() # 添加首尾邊界點 w = [0] + list(w[0]) + [data.max()] # 分箱 d3 = pd.cut(data['肝氣郁結證型系數'], k, labels=range(k)) # data['聚類'] = d3""" 自定義作圖函數顯示連續離散化(分箱)結果 """ def bin_plot(d, k):plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = Falseplt.figure(figsize=(8, 3))colors = ['ko', 'ro', 'yo', 'bo']for i in range(k):plt.plot(np.array(data[d == i]).flatten(), [i for j in d[d == i]], colors[i])plt.ylim(-0.5, k-0.5)return pltbin_plot(d1, k).show() bin_plot(d2, k).show() bin_plot(d3, k).show()等距
等頻
聚類
4.屬性構造
??在數據挖掘中,為了幫助用戶提取更有用的信息,挖掘更深層次的模式,提高挖掘結果的精度,需要利用已有的屬性集構造出新的屬性,并加入到現有的屬性集合中。
5.小波變換
??小波變換具有多分辨率的特點,在時域和頻域都具有表征信號局部特征的能力,通過伸縮和平移等運算過程對信號進行多尺度聚焦分析,提供一種非平穩信號的時頻分析手段,可以由粗及細地逐步觀察信號,從中提取有用信息。
??能夠刻畫某個問題的特征量往往隱含在一個信號中的某個或者某些分量中,小波變換可以將非平穩信號分解為不同層次、不同頻帶信息的數據序列,即小波系數,選擇適當的小波系數,即完成了信號的特征提取分析。
5.1 基于小波變換的特征提取方法
5.2 基于小波變換的多尺度空間能量分布特征提取方法
??使用PyWavelets庫進行小波變換,提取特征
三、數據歸約
??數據歸約產生更小且保持原始數據完整性的新數據集,提高效率。
- 可以降低無效、錯誤數據對建模的影響
- 少量且具有代表性的數據將大幅度縮短數據挖掘的時間
- 降低存儲數據的成本
1.屬性歸約
??屬性歸約的目標是尋找最小的屬性子集并確保新數據子集的概率分布盡可能接近原來數據集的概率分布。屬性歸約的常用方法如下:
1.1 前向挑選、后向挑選、雙向挑選
我之前實現過,可以查看鏈接數據預處理—3.變量選擇之逐步挑選—向前挑選、向后挑選、雙向挑選python實現
1.2 主成分分析
數據
from sklearn.decomposition import PCA import pandas as pddata = pd.read_excel('data/principal_component.xls',header=None) pca = PCA() pca.fit(data) print(pca.components_) # 返回各模型的特征向量 print(pca.explained_variance_ratio_.cumsum()) # 返回各個成分各自的方差占比# 發現選取前3個累計貢獻率就達到了97% pca1 = PCA(n_components=3,copy=True,whiten=False) pca1.fit(data) low_data = pca1.transform(data) # 降維后的數據 pd.DataFrame(low_data).to_excel('low_data.xls')pca1.inverse_transform(low_data) # 可以使用inverse_transform函數復原數據??原始數據從8維降到3維,同時這三維數據占了原始數據95%以上的信息。
2.數值歸約
??數值歸約通過選擇替代的、較小的數據來減小數據量,包括有參數方法和無參數方法。有參數方法是使用一個模型來評估數據,只需存放參數,而不需要存放實際數據。無參數方法是需要存放實際數據的,例如直方圖、聚類、抽樣。
2.1 直方圖
??直方圖使用分箱來近似數據分布。屬性A的直方圖將A的數據分布劃分為不相交的子集或桶。如果某個桶只代表單個屬性值/頻率對,則成為單桶。
2.2 聚類
2.3 抽樣
2.4 參數回歸
??簡單線性模型和對數線性模型可以用來近似給定數據。用簡單線性模型對數據建模,使之擬合一條直線。對數線性模型用來描述期望頻數與協變量之間的關系
如果對您有幫助,麻煩點贊關注,這真的對我很重要!!!如果需要互關,請評論留言!
總結
以上是生活随笔為你收集整理的数据挖掘实战—餐饮行业的数据挖掘之数据预处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java面试题4 牛客:运行下列代码,运
- 下一篇: java面试题43要使某个类能被同一个包