今日食餐
- ployinterp_column-->拉格朗日填充数值
- programmer_1-->筛选异常数据(包括NaN)进行填充
- programmer_2-->最小-最大规范化、零-均值规范化、小数定标规范化
- programmer_3-->利用PCA计算特征向量,用于降维分析
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的专用格式,调用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()
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()]
#取空值数据周围12个非空数据为已知数样本
return lagrange(y.index, list(y))(index)
y.index:已有数据的x。list(y):已有数据的y。 index:要插入的x 的值。
df = data[data['销量'].isnull()] #销量为空值的数据
index_list = df['销量'].index #销量为空值的数据的索引
for index in index_list:
data.loc[index,'销量']= ployinterp_column(index, data['销量'])
data.to_excel(outputfile)
2规范化处理
(1)不同规范化处理方法的选择
- 在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,StandardScaler表现更好(避免不同量纲对方差、协方差计算的影响);
- 在不涉及距离度量、协方差、数据不符合正态分布、异常值较少的时候,可使用MinMaxScaler。(eg:图像处理中,将RGB图像转换为灰度图像后将其值限定在 [0, 255] 的范围);
- 在带有的离群值较多的数据时,推荐使用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)
#指定作为列名的行,默认0,即取第一行,数据为列名行以下的数据;
#若数据不含列名,则设定 header = None;
data.head()
print('最大最小规范化')
print((data - data.min()) / (data.max() - data.min()))
print('零均值规范化')
print((data - data.mean()) / data.std()) #按列标准化
print('单列')
print((data.iloc[:,0] - data.iloc[:,0].mean()) / data.iloc[:,0].std())
from sklearn import preprocessing
print('\n sklearn-preprocessing.scale')
data_scale=preprocessing.scale(data)
#在SciKit-Learn中的preprocessing.scale()可以直接将给定数据进行Z-Score规范化。按列标注化
print(data_scale,'\n')
print(data_scale.mean(axis=0))
print(data_scale.std(axis=0))#默认按行计算
print('\n小数定标规范化')
#np.ceil返回大于等于该值的最小整数,np.log10计算最高位是几位数,log10(100)=2
#通过移动小数点的位置来进行规范化。小数点移动的位数取决于该属性数据取值的最大绝对值。
print(data / 10**np.ceil(np.log10(data.abs().max())))
3 聚类
datafile = path + '/chapter4/data/discretization_data.xls'
data = pd.read_excel(datafile)
data.head()
data = data['肝气郁结证型系数'].copy()
k = 4
方法一 直接对数组进行分类--分箱等距
d1 = pd.cut(data, k, labels=range(k))
方法二: 等频率离散化
w = [1.0 * i / k for i in range(k + 1)]
# percentiles表示特定百分位数,同四分位数
w = data.describe(percentiles=w)[4:4 + k + 1]
#取几个分位数的值作为不等长列表,用于cut函数
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)
# 相邻两项求中点,作为边界点
w = DataFrame.rolling(c, 2).mean().iloc[1:]
# 加上首末边界点
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])
4利用PCA计算特征向量,用于降维分析
PCA(Principal Component Analysis,主成分分析)。降维致力于解决三类问题。
- 降维可以缓解维度灾难问题;
- 降维可以在压缩数据的同时让信息损失最小化;
- 理解几百个维度的数据结构很困难,两三个维度的数据通过可视化更容易理解。
当数据集不同维度上的方差分布不均匀的时候,PCA最有用。如果是一个球壳形数据集,PCA不能有效的发挥作用,因为各个方向上的方差都相等;没有丢失大量的信息维度一个都不能忽略。
inputfile = path + "/chapter4/data/principal_component.xls"
outputfile = "tmp/tmp4/dimention_reducted.xls"
data = pd.read_excel(inputfile, header=None)
data.head()
pca = PCA()
data_pca=pca.fit(data)
#禁用科学计数法
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之后是不是就该怎么建模怎么建模了,它只是减少了输入维度?(请路过的高人指教~)