用pandas处理缺失值补全及DictVectorizer特征转换

下面介绍的是用pands读取泰坦尼克遇难船员的数据,然后挑选特征,补全缺失值,特征转换。

1.pands读取数据

titanic=pd.read_csv('./titanic.txt')

其数据形式如下:

row_num pclass survived name age embarked home.dest room ticket boat sex
3 1st 0 Allison 30. Southampton Montreal C26 (135) male

使用Pandas读入的数据都有pandas独有的dataframe格式,使用info()可查看数据的统计特性

print titanic.info()

>>
>>
RangeIndex: 1313 entries, 0 to 1312 #数据集一共有1313个样本0-1312
Data columns (total 11 columns): #一共有11列
row.names    1313 non-null int64 #有1313个,类型为整型
pclass       1313 non-null object #有1313个,类型对象型,如字符串
survived     1313 non-null int64 #有1313个,类型为整型
name         1313 non-null object #有1313个,类型为对象
age          633 non-null float64 #有633个(即有680个缺失值)
embarked     821 non-null object # 以下同理,不表
home.dest    754 non-null object
room         77 non-null object
ticket       69 non-null object
boat         347 non-null object
sex          1313 non-null object
dtypes: float64(1), int64(2), object(8)

2.挑选特征

我们知道,在原始数据集中,并不是所有的特征对于训练都有用;所以我们就要根据相关背景来进行筛选。此处我们选取sex,age,pclass这三个维度的特征用于训练。

X=titanic[['pclass','age','sex']]
y=titanic['survived']
print X

>>
>>
     pclass      age     sex
0       1st  29.0000  female
1       1st   2.0000  female
2       1st  30.0000    male
3       1st  25.0000  female
4       1st   0.9167    male
5       1st  47.0000    male
6       1st  63.0000  female
7       1st  39.0000    male
8       1st  58.0000  female
9       1st  71.0000    male
10      1st  47.0000    male
11      1st  19.0000  female
...     ...      ...     ...


print X.info()

>>
>>
[1313 rows x 3 columns]
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1313 entries, 0 to 1312
Data columns (total 3 columns):
pclass    1313 non-null object
age       633 non-null float64
sex       1313 non-null object
dtypes: float64(1), object(2)
memory usage: 30.8+ KB

此时我们可以看到,X中就只有三个维度了;但从X.info()中我们可以看出:
①维度age中仍然有缺失值,需要补全;
②维度pclass和sex维度均为对象值,要进行特征转换;

3.缺失值补全

首先我们需要补充age里的数据,通常使用平均数或者中位数都是对模型偏离造成最小影响的策略。

X['age'].fillna(X['age'].mean(),inplace=True)

print X.info()

>>
>>
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1313 entries, 0 to 1312
Data columns (total 3 columns):
pclass    1313 non-null object
age       1313 non-null float64
sex       1313 non-null object
dtypes: float64(1), object(2)
memory usage: 30.8+ KB

可以看到,此时已经不存在缺失值了。

4.特征转换

先解释一下特征转换,我们知道对象类型的数据是无法进行计算的,所有我们就需要将其转换成其他形式;最直接的就是转换成0,1值,比如性别这个维度就可以用0,1来代替。但是如果有三种类型呢?比如某个维度有great,good,bad有三种取值,那么该如何转换呢?这儿用到的方法就是将这一个维度展开成三个维度,即great,good,bad分别构成一个维度,每个维度都用0,1取值来处理。

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=33)#在进行特征转换之前,我们先对数据集进行切分


vec=DictVectorizer(sparse=False) #sparse=False意思是不用稀疏矩阵表示
X_train=vec.fit_transform(X_train.to_dict(orient='record'))
X_test=vec.transform(X_test.to_dict(orient='record'))

print vec.feature_names_ #查看转换之后的特征维度
print X_train # 转换后的训练集

>>
>>
['age', 'pclass=1st', 'pclass=2nd', 'pclass=3rd', 'sex=female', 'sex=male']

[[ 31.19418104   0.           0.           1.           0.           1.        ]
 [ 31.19418104   1.           0.           0.           1.           0.        ]
 [ 31.19418104   0.           0.           1.           0.           1.        ]
 ..., 
 [ 12.           0.           1.           0.           1.           0.        ]
 [ 18.           0.           1.           0.           0.           1.        ]
 [ 31.19418104   0.           0.           1.           1.           0.        ]]

此时我们就等到了处理好的完整的数据集,就可以将其用于训练了。

源码

参考:

  • Python机器学习及实践

猜你喜欢

转载自blog.csdn.net/the_lastest/article/details/79103386
今日推荐