数据处理,特征工程,特征选择
# 工具库
import pandas as pd
# 泰坦尼克数据集
df_train = pd.read_csv('titanic.csv')
# 了解一下数据集
df_train.head()
- surived:0 遇难 1 获救
- pclass: 船舱等级 1 2 3
- sibsp:堂兄弟姐妹个数
- parch:父母 小孩个数
- cabin:船舱号
- Embarked:登船的口岸
df_train.shape # 查看维度
df_train.info() # 数据集信息
- Age有714个值
- Cabin Embarked 也有不同程度的缺失
df_train.describe() # std:标准差
基本数据处理
缺失值处理
可以用pandas的fillna函数
# 用均值填充 age字段 可以用 df_train['Age']查看原始数据中部分 Age字段缺失 为 NaN
df_train['Age'].fillna(value=df_train['Age'].mean()) # 均值为 29.699118
借助Sklearn 中的Imputer
#from sklearn.preprocessing import Imputer
from sklearn.impute import SimpleImputer
import numpy as np
imp = SimpleImputer(missing_values=np.nan,strategy='mean') # axis=0 不能加 missing_values='NaN' 会报错
# 填充
age = imp.fit_transform(df_train[['Age']].values)
开始填充
df_train.loc[:,'Age']= df_train['Age'].fillna(value=df_train['Age'].mean()) # loc 定位 冒号表示所有行
# 查看 也可以用 df_train.info() 来查看
df_train.head(10)
常见的特征工程操作
数值型
0.幅度变换
#取对数变换
log_age = df_train['Age'].apply(lambda x:np.log(x))
# 新加一列 log_age
df_train.loc[:,'log_age'] = log_age
# 幅度缩放,最大最小缩放
from sklearn.preprocessing import MinMaxScaler
mm_scaler = MinMaxScaler()
fare_trans = mm_scaler.fit_transform(df_train[['Fare']]) # 对船票字段 最大最小 缩放
# 幅度缩放,最大最小缩放
from sklearn.preprocessing import StandardScaler
std_scaler = StandardScaler()
fare_std_trans = std_scaler.fit_transform(df_train[['Fare']]) # 对船票字段 标准化 缩放
1.统计值
# 最大最小值
max_age = df_train['Age'].max()
min_age = df_train['Age'].min()
# 分位数
age_sqarter_1 = df_train['Age'].quantile(0.25) # 上分位数
age_sqarter_3 = df_train['Age'].quantile(0.75) # 下分位数
2.四则运算
# 一个数和一列数可以相加
#新建一个家庭人数字段
df_train.loc[:,'family_size'] = df_train['SibSp']+df_train['Parch']+1
3.高次特征与交叉特征
[x1 x2 x3] =>[x1^2 x3^3 x1x2 x1x3]
# 数值型 多项式特征
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=2) # 最高2次 同事计算所有交叉项 0次 1次 2次
df_train[['SibSp','Parch']].head() # 堂兄姐妹 父母
poly_fea = poly.fit_transform(df_train[['SibSp','Parch']])
4.离散化/分箱/分桶
# 等距切分
df_train.loc[:,'fare_cut'] = pd.cut(df_train['Fare'],5) # 对船票等距切分5段
df_train['fare_cut'].unique() # 查看切分后的5段价格区间, 缺点:容易产生聚集
# 等频切分
df_train.loc[:,'fare_qcut'] = pd.qcut(df_train['Fare'],5)
5. OneHot encoding 独热向量编码
# 把数据平铺开来的操作
embarked_oht = pd.get_dummies(df_train[['Embarked']]) # 把登船的 S C Q 口岸 拉成了一列
# 把船票分频结果再做一次 onehot
fare_qcut_oht = pd.get_dummies(df_train[['fare_qcut']])
时间型
6.日期处理
car_sales = pd.read_csv('car_data.csv')
car_sales.head()
结果:
0 2014/9/19 NaN
1 2013/10/11 69.0
2 2013/10/11 23.0
3 2014/10/23 88.0
4 2014/11/3 29.0
car_sales.info()
结果:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1986 entries, 0 to 1985
Data columns (total 2 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 date_t 1986 non-null object
1 cnt 1976 non-null float64
dtypes: float64(1), object(1)
memory usage: 31.2+ KB
car_sales.describe()
结果:
count 1976.000000
mean 60.165486
std 23.325576
min 20.000000
25% 40.000000
50% 60.000000
75% 80.000000
max 100.000000
car_sales['date_t'].dtype # 查看类型 为object
# 解析成日期型
car_sales.loc[:,'date'] = pd.to_datetime(car_sales['date_t'])
7.取出关键时间信息
# 取出几月份
car_sales.loc[:,'month'] = car_sales['date'].dt.month
temp_date = car_sales['date'].dt
temp_date.day # 查看几号
temp_date.dayofweek # 一周中的第几天
# 取出来是几号
car_sales.loc[:,'dom'] = car_sales['date'].dt.day
# 取出一年当中的第几天
car_sales.loc[:,'day'] = car_sales['date'].dt.dayofyear
# 取出星期几
car_sales.loc[:,'dow'] = car_sales['date'].dt.dayofweek
# 判断是不是周末
car_sales.loc[:,'is_weekend'] = car_sales['dow'].apply(lambda x: 1 if (x==0 or x==6) else 0)
文本型
8.词袋模型
#引入计数器向量化处理
from sklearn.feature_extraction.text import CountVectorizer
vectorizer =CountVectorizer()
corpus = [
'This is a very good class',
'Student are very very very good',
'This is the third sentence',
'Is this the last doc'
]
x = vectorizer.fit_transform(corpus) # 把文本表示成向量
vectorizer.get_feature_names()
x.toarray()
vec = CountVectorizer(ngram_range=(1,3)) # 两两 三三 连续的模型
x_ngram = vec.fit_transform(corpus)
vec.get_feature_names()
x_ngram.toarray()
9.TF-IDF
带着权重的表示形式
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf_vec = TfidfVectorizer()
tfidf_x = tfidf_vec.fit_transform(corpus)
tfidf_vec.get_feature_names()
tfidf_x.toarray()
10.组合特征
# 借助条件去判断获取组合特征
# 判断一个人是不是自己去旅游
df_train.loc[:,'alone'] = (df_train['SibSp']==0)&(df_train['Parch']==0)
df_train.head()