在整理特征工程的思路时,看到参考 1 中有些同行做了代码的整理,我觉得也挺不错的,以后方便很快上手,于是也开始整理了对于特征工程的代码模板整理操作,在整理时要有一个原则,要尽量将事情说清楚明白,不要嫌麻烦。
1. Import 即常见基本操作
# 常用头文件
# -*- coding: utf-8 -*-
import numpy as np # 数学
import pandas as pd # 表格
import matplotlib.pyplot as plt # 图形
%matplotlib inline
import warnings
warnings.filterwarnings("ignore") # 除去恼人的警告信息
import sys
stdout = sys.stdout
reload(sys)
sys.setdefaultencoding('utf-8')
sys.stdout = stdout
# 如果需要绘制图像,且要显示中文的话
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
2. 文件格式数据读取
# 1. CSV 文件
train_df = pd.read_csv(data_dir + 'train_dataset.csv', sep=',', header=0)
# 2. 读取 json(理解为字典格式的封装)
import json
for line in sys.stdin:
line = ln.decode('gbk').strip().strip('\n')
# line = line.replace("\\","")
json_data = json.loads(line) #loads()json数据:->python数据
# 对于单值数据
cat = json_data['animal']['cat']
# 对于多值数据({"xx1":"1","xx2":"2"})
Husky = json_data['animal']['dog'].get('Husky', {})
# dumps():python数据->json数据
Husky = json.dumps(Husky, ensure_ascii=False, encoding="gbk")
Husky = json.loads(Husky)
## 输出
for key in dict_:
print("\t".join([str(key), str(dict_[key]), str(ctr)]))
print("{}\t{}\t{:.8f}".format(key, dict_[key], ctr))
3. 特征工程
3.1 数据选择
# 读取 CSV 文件
train_df = pd.read_csv(data_dir + 'train_dataset.csv', sep=',', header=0)
train_df.info() # 查看总体的情况,找出一些数据猫腻,有无 null 值
train_df.describe() # 看总数及数值类型,以及是否有长尾分布(分位点)
train_df.columns # 获取列名
train_df.isnull().sum() # 获取空值
data_df['用户年龄', '用户话费敏感度'] # 选择特定列特征
data_df.loc[data_df['用户年龄'] == 0, '用户年龄'] = data_df['用户年龄'].mode() # 按照条件选择特征
# 统计次数,默认降序,升序为 ascending=True
data_df['当月网购类应用使用次数'].value_counts()
# 统计频率,默认降序
data_df['当月网购类应用使用次数'].value_counts(normalize=True)
#分地区记录发生的事件数
df2 = df.groupby(by=['region'])['eventid'].count()
#第一列地区,第二列该地区发生的事件数
count = pd.DataFrame({"region":df2.index,"counts":df2})
#返回武器-该武器杀人总数
df2 = df.groupby(by=['weapontype'])['nkill'].sum()
data = pd.concat([train,predict]) #上下拼接
data = pd.merge(data,ad_feature,on='aid',how='left') #键值左连接
3.2 缺失值处理
# 对于大量缺失数据的列可直接删除
df = df.drop(['PassengerId','Name','Ticket','Cabin'], axis=1)
# 删除含有 NaN 数据的行
df = df.dropna()
# 全部直接人工赋值
df = df.fillna('-1')
df['nkill'].fillna(0, inplace = True) #单列直接人工赋值
df['Embarked'] = df['Embarked'].fillna('S') #离散值填充众数
median_age = train['Age'].median() #连续值填充中位数(或者平均值)
df['Age'] = df['Age'].fillna(median_age)
3.3 数据转换
df.loc[ (df.Sex == 'male'), 'Sex' ] = 0 # 令男为0
df.loc[ (df.Sex == 'female'), 'Sex' ] = 1 # 令女为1
df['Sex'] = df['Sex'].map( {'male': 0, 'female': 1} ).astype(int) # 这种写法更好
3.4 特征处理
# 特征合并
#1、称谓
df['Title'] = df['Name'].str.extract('([A-Za-z]+)\.', expand=False)
df['Title'] = df['Title'].fillna('NoTitle')
df['Title'] = df['Title'].replace(['Lady', 'Countess','Capt', 'Col','Don', 'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Rare')
df['Title'] = df['Title'].replace(['Mlle','Ms'], 'Miss')
df['Title'] = df['Title'].replace('Mme', 'Mrs')
#2、亲戚数量与子女数量
df['Companions'] = df['Parch'] + df['SibSp']
to_be_dropped.extend(['Parch', 'SibSp'])