今日食餐
- ployinterp_column-->拉格朗日填充數(shù)值
- programmer_1-->篩選異常數(shù)據(jù)(包括NaN)進(jìn)行填充
- programmer_2-->最小-最大規(guī)范化、零-均值規(guī)范化吉嚣、小數(shù)定標(biāo)規(guī)范化
- programmer_3-->利用PCA計(jì)算特征向量,用于降維分析
import os
import numpy as np
import pandas as pd
from pandas import DataFrame, Series
import matplotlib.pyplot as plt
import pywt
from scipy.interpolate import lagrange
from scipy.io import loadmat # mat是MATLAB的專用格式蒋院,調(diào)用loadmat方法讀取
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
1 lagrange填充空值
path = os.getcwd()
inputfile = path + '/chapter4/data/catering_sale.xls'
outputfile = path + '/tmp/tmp4/sales.xls'
data = pd.read_excel(inputfile)
data.head()
360截圖18430704113413.png
data[(data['銷量'] < 400) | (data['銷量'] > 5000)] = None
def ployinterp_column(index, df, k=5):
y = df[list(range(index - k, index))
+ list(range(index + 1, index + 1 + k))]
y = y[y.notnull()]
#取空值數(shù)據(jù)周圍12個非空數(shù)據(jù)為已知數(shù)樣本
return lagrange(y.index, list(y))(index)
y.index:已有數(shù)據(jù)的x。list(y):已有數(shù)據(jù)的y乾忱。 index:要插入的x 的值娱挨。
df = data[data['銷量'].isnull()] #銷量為空值的數(shù)據(jù)
index_list = df['銷量'].index #銷量為空值的數(shù)據(jù)的索引
for index in index_list:
data.loc[index,'銷量']= ployinterp_column(index, data['銷量'])
data.to_excel(outputfile)
2規(guī)范化處理
(1)不同規(guī)范化處理方法的選擇
- 在分類、聚類算法中洋侨,需要使用距離來度量相似性的時候、或者使用PCA技術(shù)進(jìn)行降維的時候倦蚪,StandardScaler表現(xiàn)更好(避免不同量綱對方差希坚、協(xié)方差計(jì)算的影響);
- 在不涉及距離度量陵且、協(xié)方差裁僧、數(shù)據(jù)不符合正態(tài)分布、異常值較少的時候慕购,可使用MinMaxScaler聊疲。(eg:圖像處理中,將RGB圖像轉(zhuǎn)換為灰度圖像后將其值限定在 [0, 255] 的范圍)沪悲;
- 在帶有的離群值較多的數(shù)據(jù)時获洲,推薦使用RobustScaler。
(2)preprocessing.scale 與 preprocessing.StandardScaler
使用sklearn.preprocessing.StandardScaler類殿如,使之fit(X_Train)
datafile = path + '/chapter4/data/normalization_data.xls'
data = pd.read_excel(datafile, header=None)
#指定作為列名的行贡珊,默認(rèn)0最爬,即取第一行,數(shù)據(jù)為列名行以下的數(shù)據(jù)飞崖;
#若數(shù)據(jù)不含列名,則設(shè)定 header = None谨胞;
data.head()
360截圖18430702597672.png
print('最大最小規(guī)范化')
print((data - data.min()) / (data.max() - data.min()))
print('零均值規(guī)范化')
print((data - data.mean()) / data.std()) #按列標(biāo)準(zhǔn)化
print('單列')
print((data.iloc[:,0] - data.iloc[:,0].mean()) / data.iloc[:,0].std())
360截圖1624122095136134.png
from sklearn import preprocessing
print('\n sklearn-preprocessing.scale')
data_scale=preprocessing.scale(data)
#在SciKit-Learn中的preprocessing.scale()可以直接將給定數(shù)據(jù)進(jìn)行Z-Score規(guī)范化固歪。按列標(biāo)注化
print(data_scale,'\n')
print(data_scale.mean(axis=0))
print(data_scale.std(axis=0))#默認(rèn)按行計(jì)算
360截圖18500828194268.png
print('\n小數(shù)定標(biāo)規(guī)范化')
#np.ceil返回大于等于該值的最小整數(shù),np.log10計(jì)算最高位是幾位數(shù)胯努,log10(100)=2
#通過移動小數(shù)點(diǎn)的位置來進(jìn)行規(guī)范化牢裳。小數(shù)點(diǎn)移動的位數(shù)取決于該屬性數(shù)據(jù)取值的最大絕對值。
print(data / 10**np.ceil(np.log10(data.abs().max())))
360截圖18430710251424.png
3 聚類
datafile = path + '/chapter4/data/discretization_data.xls'
data = pd.read_excel(datafile)
data.head()
360截圖17001019102137115.png
data = data['肝氣郁結(jié)證型系數(shù)'].copy()
k = 4
方法一 直接對數(shù)組進(jìn)行分類--分箱等距
d1 = pd.cut(data, k, labels=range(k))
方法二: 等頻率離散化
w = [1.0 * i / k for i in range(k + 1)]
# percentiles表示特定百分位數(shù)叶沛,同四分位數(shù)
w = data.describe(percentiles=w)[4:4 + k + 1]
#取幾個分位數(shù)的值作為不等長列表蒲讯,用于cut函數(shù)
w[0] = w[0] * (1 - 1e-10)
d2 = pd.cut(data, w, labels=range(k))
方法三: 使用Kmeans
kmodel = KMeans(n_clusters=k, n_jobs=4)
kmodel.fit(data.values.reshape(len(data), 1))
# 輸出聚類中心,并且排序
c = DataFrame(kmodel.cluster_centers_).sort_values(0)
# 相鄰兩項(xiàng)求中點(diǎn)灰署,作為邊界點(diǎn)
w = DataFrame.rolling(c, 2).mean().iloc[1:]
# 加上首末邊界點(diǎn)
w = [0] + list(w[0]) + [data.max()]
d3 = pd.cut(data, w, labels=range(k))
def cluster_plot(d, k):
plt.figure(figsize=(8, 3))
for j in range(0, k):
plt.plot(data[d == j], [j for i in d[d == j]], 'o')
plt.ylim(-0.5, k - 0.5)
return plt
cluster_plot(d1, k).show()
cluster_plot(d2, k).show()
cluster_plot(d3, k).show()
print('d1等距\n',d1[:5])
print('d2百分位\n',d2[:5])
print('d3聚類\n',d3[:5])
360截圖17970217292761.png
4利用PCA計(jì)算特征向量判帮,用于降維分析
PCA(Principal Component Analysis,主成分分析)溉箕。降維致力于解決三類問題晦墙。
- 降維可以緩解維度災(zāi)難問題;
- 降維可以在壓縮數(shù)據(jù)的同時讓信息損失最小化肴茄;
- 理解幾百個維度的數(shù)據(jù)結(jié)構(gòu)很困難晌畅,兩三個維度的數(shù)據(jù)通過可視化更容易理解。
當(dāng)數(shù)據(jù)集不同維度上的方差分布不均勻的時候寡痰,PCA最有用抗楔。如果是一個球殼形數(shù)據(jù)集,PCA不能有效的發(fā)揮作用拦坠,因?yàn)楦鱾€方向上的方差都相等连躏;沒有丟失大量的信息維度一個都不能忽略。
inputfile = path + "/chapter4/data/principal_component.xls"
outputfile = "tmp/tmp4/dimention_reducted.xls"
data = pd.read_excel(inputfile, header=None)
data.head()
360截圖18430702749187.png
pca = PCA()
data_pca=pca.fit(data)
#禁用科學(xué)計(jì)數(shù)法
np.set_printoptions(suppress=True, precision=10, threshold=2000, linewidth=150)
pd.set_option('display.float_format',lambda x : '%.2f' % x)
# 返回各個模型的特征向量
pca.components_
# 返回各個成分各自的方差百分比
pca.explained_variance_ratio_
data.to_excel(outputfile, index=False)
遺留問題:pca之后是不是就該怎么建模怎么建模了贞滨,它只是減少了輸入維度反粥?(請路過的高人指教~)