@TOC
任务
【任务五-特征工程1】关于数据类型转换以及缺失值处理(尝试不同的填充看效果)以及你能借鉴的数据探索
遇到的问题
SVM模型训练时一直卡住不动,【原因是数据没有标准化或者是归一化】
删去无关特征
对每一列的数据进行统计,如果这一列的数据每一个都不同,即判断为无关特征并且删去。
for i in data.columns:
count = data[i].count()
if len(list(data[i].unique())) in [1,count,count-1]:
data.drop(i,axis = 1,inplace=True )
2.1 缺失值处理
填充固定值
data.fillna(0, inplace=True) #
众数填充
考虑给某列的缺失值,填充为该列的众数,由于众数可能存在多个,所以pandas返回的是一个Series,而不像mean()返回的是一个值,默认取第一个众数。(目前没有找到一次填充完成的方法)
col.fillna(col.mode()[0], inplace=True)
一次 填充众数完成
data = pd.read_csv(path + 'data_set/data.csv',encoding='gbk')
filter_feature = ['status'] # 过滤无用的维度
features = []
for x in data.columns: # 取特征
if x not in filter_feature:
features.append(x)
data.fillna(data.mode(),inplace=True) # 填充众数,该数据缺失太多众数出现为nan的情况
features_mode = {}
for f in features:
features_mode[f] = list(data[f].dropna().mode().values)[0]
data.fillna(features_mode,inplace=True)
temp1=data.isnull()
num=(temp1 == True).astype(bool).sum(axis=1)
均值填充(可以一次填充完成)
data.fillna(data.mean(),inplace=True)
用前后数据进行填充
# 用前一个数据进行填充
data = data.fillna(method='pad')
# 用后一个数据进行填充
data = data.fillna(method='bfill')
用插值法填充
data = data.interpolate()
用每一个特征的全局平均值来代替无效值 (什么是全局平均值???)
代码如下:
from sklearn.preprocessing import Imputer
import numpy as np
#导入要进行缺失值处理的数据文件,数据文件上面有展示
data = np.genfromtxt('input.csv', skip_header=True, delimiter=',')
imp = Imputer(missing_values='NAN', strategy='mean', axis=0)
#上面'NAN'表示无效值在数据文件中的标识是'NAN',strategy='mean'表示用全局平均值代替无效值,axis=0表示对列进行处理
imp.fit(data)
#训练一个缺失值处理模型
outfile = imp.transform(data)
用fancyimpute 包进行填充
这里需要安装fancyimpute 包
具体步骤:
conda install ecos
conda install CVXcanon
安装visual C++
安装tensorflow
安装fancyimpute
更新numpy
from fancyimpute import BiScaler, KNN, NuclearNormMinimization, SoftImpute
# 用KNN进行填充
X_filled_knn = KNN(k=3).fit_transform(data)
# matrix completion using convex optimization to find low-rank solution,that still matches observed values. Slow!
#(用凸优化法求矩阵补全的低秩解,这仍然与观测值相匹配。比较慢!————以上翻译结果来自机器翻译,仅供参考,)
X_filled_nnm = NuclearNormMinimization().fit_transform(data)
# Instead of solving the nuclear norm objective directly, instead induce sparsity using singular value thresholding
#(采用奇异值阈值法诱导稀疏性,而不是直接求解核范数目标————以上翻译结果来自机器翻译,仅供参考,)
X_filled_softimpute = SoftImpute().fit_transform(X_incomplete_normalized)
以上来源于网络,不太理解
训练模型填充空值(fill null)的几种方法
2.2 数据类型转换
使用映射,把不同的非数值类型转换成数值类型
n = set(data['id_name'])
dic = {}
for i, j in enumerate(n):
dic[j] = i
data['id_name'] = data['id_name'].map(dic)
数据标准化
数据标准化,公式为: 计算时对每个属性/每列分别进行
from sklearn import preprocessing
zdata = preprocessing.scale(data)
数据归一化
数据缩至0-1之间,每一行表示一个样本,每一列表示一个特征参数
公式为
from sklearn import preprocessing
min_max_scale = preprocessing.MinMaxScaler()
min_max_data = min_max_scale.fit_transform(data)