1.数据处理、特征工程、特征选择内容
-
数据处理
- 分析数据的分布模式 - 发现异常值/噪声(boxplot,quantile)
- pandas工具库:数据类型(时间型读成字符串),数字形态的类别型(userid, 没有大小关系),数据类型优化
- 缺失值(数值型/类别型,缺失比例)
- 时间序列:趋势分析
- 单维度(连续值distplot、类别型countplot/value_counts)、关联维度(corr, heatmap)
- 业务数据中做建模:最有效的特征通常是统计特征(怎么做统计,有哪些类别型的列可以做为groupby的对象,有哪些数值型的列可以用于统计聚合),特别留意置信度(总数很小的时候,统计值不稳定,比例型特征稳定度高于绝对值)
-
特征工程
- 数值型
- 幅度缩放(最大最小值缩放、归一化...)
- 离散化/分箱分桶(等距pd.cut、等频pd.qcut)(非线性/加速/特征交叉/健壮性)
- 统计值(max min quantile)
- 四则运算(加减乘除)
- 幅度变化(有一些模型对于输入数据有分布假设,线性回归假设输入连续值特征符合正态分布,log1p/exp)
- 监督学习分箱(用决策树建模,用决策树学习连续值划分方式,把决策树中间节点取出来作为组合特征) sklearn dt apply
- 类别型
- OneHot-encoding
- label-encoding
- binary-encoding
- category-encoding
- 时间型
- 时间点/时间段(星期几、几点钟)
- 时间分组/分段(工作日、周末、法定节假日...)
- 时间间隔(距离当前为止...)
- 和数值型一起做统计特征的时候,会选取不同的时间窗...
- 组合...
- 文本型
- 词袋模型
- tf-idf
- lda
- word2vec/word embedding
- ...
- 数值型
-
特征选择
- 过滤型(filter)
- 包裹型(wrapper)
- 嵌入型(embedded)
- 基于树模型去判断特征的重要度,做实验去筛选
1.0.1数据载入
import pandas as pd
df_train =pd.read_csv('train.csv')
1.0.2了解数据
- head()
- info()
- describe()
df_train.head()
df_train.shape
df_train.info()
df_train.describe()
1.1基本数据处理
1.1.1 0缺失值处理
- pandas fillna
- sklearn Imputer
1.1.1.1 可以用pandas的fillna函数
df_train['Age'].head(10)
df_train['Age'].fillna(value = df_train['Age'].mean()).head(10)
1.1.1.2 借助sklearn中的Imputer
from sklearn.preprocessing import Imputer
imp = Imputer(missing_values = 'NaN' , strategy = 'mean' ,axis = 0)
age = imp.fit_transform(df_train[['Age']].values)
df_train.loc[: , 'Age'] = df_train['Age'].fillna(value = df_train['Age'].mean())
df_train.head(10)
df_train.info()
1.2常见的特征工程
1.2.1 数值型
1.2.1.1 幅度缩放
- apply+numpy
- preprocessing scaler
#取对数等变换
import numpy as np
log_age = df_train['Age'].apply(lambda x:np.log(x))
df_train.loc[:,'log_age'] = log_age
df.train.head(10)
#幅度缩放,最大值最小值缩放
from sklearn.propressing import MinMaxScaler
mm_scaler = MinMaxScaler()
fare_trans = mm_scaler.fit_transform(df_train[['Fare']])
#幅度缩放,标准化
from sklearn.propressing import StandarScaler
std_scaler = StandardScaler()
fare_std_trans = std_scaler.fit_transfrom(df_train[['Fare']])
1.2.1.2 统计值
- max , min
- quantile
#最大值最小值
max_age = df_train['Age'].max()
min_age = df_train['Age'].min()
#分位数
age_quarter_1 = df_train['Age'].quantile(0.25)
age_quarter_3 = df_train['Age'].quantile(0.75)
age_quarter_1
age_quarter_3
1.2.1.3 四则运算
df_train.head()
df_train.loc[:,'family_size'] = df_train['SibSp'] + df_train['Parch'] +1
df_train.head()
df_train.loc[:,'tmp'] = df_train['Age'] * df_train['Pclass'] +4*df_train['familiy_size']
df_train.head()
1.2.1.4 高次特征与交叉特征
- preprocessing.PolynomialFeatures
[x1 x2 x3] => [x1^2 x3^3 x1*x2 x1*x3]
from sklearn.preprocessing import PolynomialFeatures
poly = PloynomialFeatrues(degree = 2)
df_train[['SibSp' ,'Parch']] .head()
poly_fea = ploy.fit_transform(df_train[['SibSp' , 'Parch']])
poly_fea
1.2.1.5 离散化/分箱/分桶
- pandas cut
- pandas qcut
#等距切分
df_train.loc[:,'fare_cut'] = pd.cut(df_train['Fare'] , 5)
df_train.head()
df_train['fare_cut'].unique()
#等频切分
df_train.loc[: , 'fare_cut'] = pd.qcut(df_train['Fare'] , 5)
df_train.head()
1.2.2类别型(离散型)
1.2.2.1 OneHot encoding/独热向量编码
- pandas get_dummies
- OneHotEncoder()
df_train.info()
embarked_oht = pd.get_dummies(df_train[['Embarked']])
embarked_oht.head()
fare_qcut_oht = pd.get_dummies(df_train[['fare_cut']])
fare_qcut_oht.head()
1.2.3 组合特征
df_train.head()
#借助条件去判断获取组合特征
df_train.loc[:,'alone'] = (df_train['SibSp'] == 0) &(df_train['Parch'] == 0)
1.2.4时间型
1.2.4.1日期处理
- pandas to_datetime
car_sales = pd.read_csv('car_data.csv')
car_sales.head()
car_sales.info()
car_sales.describe()
car_sales['date_t'].dtype
car_sales.loc[:,'date'] = pd.to_datetime(car_sales['date_t'])
car_sales.info()
car_sales.head()
1.2.4.2 取出关键时间信息
- dt.month
- dt.dayofweek
- dt.dayofyear
- ...
#取出几月份
car_sales.loc[:,'month'] = car_sales['date'].dt.month
car_sales.head()
tmp_date = car_sales['date'].dt
#取出来是几号
car_sales.loc[:,'dom'] = car_sales['date'].dt.day
car_sales.loc[:,'doy'] = car_sales['date'].dt.dayofyear
car_sales.loc[:,'dow'] = car_sales['date'].dt.dayofweek
car_sales.head()
car_sales.loc[:,'is_weekend'] = car_sales['dow'].apply(lambda x: 1 if (x==0 or x==6) else 0)
car_sales.head()
1.2.5 文本型
1.2.5.1 词袋模型
-
CountVectorizer
from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer()
corpus = [
'欢迎 大家 学习 这 个 课程',
'机器学习 需要 一定 的 数学 基础',
'课程 里 的 内容 会 涉及 机器学习 和 数学 原理',
'希望 大家 都 能 消化 课程 内容'
]
X = vectorizer.fit_transfrom(corpus)
X
vectorizer.get_feature_names()
X.toarray()
vec = CountVectorizer(ngram_range = (1,3))
x_ngram = vec.fit_transform(corpus)
vec.get_feature_names()
X_ngram.toarry()
1.2.5.2
-
TFidfVectorizer
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()
1.3 特征选择
1.3.1 过滤式/Filter
- SelectKBest
- 通常在线性模型中会使用
from sklearn.feature_selection import SelectKBest
from sklearn.datasets import load_iris
iris = load_iris()
X , y = iris.data , iris.target
X.shape
X[:5,:]
y
X_new = SelectKBest(k=2).fit_transform(X , y)
X_new.shape
X_new[:5,:]
1.3.2 包裹型/wrapper
- RFE
from sklearn.feature_selection import RFE
from sklearn.ensamble import RandomForesClassifier
rf = RandomForestClassifier()
rfe = RFE(estimator = rf , n_features_to_select =2 )
X_rfe = rfe.fit_transform(X,y)
X_rfe.shape
X_rfe[:5,:]
1.3.3 嵌入式Embedding
- SelectFromModel
from sklearn.feature_selection import SelectFromModel
from sklearn.svm import LinearSVC
lsvc = linearSVC(C = 0.01 , penalty = 'l1' , dual = False).fit(X , y)
model = SelectFromModel(lsvc , preft = True)
X_embed = model.transform(X)
X_embed.shape
X_embed[:5,:]