机器学习一个小目标——Task5

@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)

数据标准化

数据标准化,公式为: ( x x m e a n ) x s t d \frac{(x-x_{mean})}{x_{std}} 计算时对每个属性/每列分别进行

from sklearn import preprocessing
zdata = preprocessing.scale(data)

数据归一化

数据缩至0-1之间,每一行表示一个样本,每一列表示一个特征参数
公式为 x = x x m a x x m a x x m i n x^{'}=\frac{x-x_{max}}{x_{max}-x_{min}}

from sklearn import preprocessing
min_max_scale = preprocessing.MinMaxScaler()
min_max_data = min_max_scale.fit_transform(data)

猜你喜欢

转载自blog.csdn.net/Heitao5200/article/details/84322187
今日推荐