特征工程

数据处理,特征工程,特征选择

# 工具库
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()