第六部分 数据建模实操
导入常规库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
数据读取
用pandas下的read_csv方法,读取csv文件;pd.read_csv(),如果文件名称包含中文,需要增加engine=’python’
用pandas的read_table方法,读取通用分隔符分割的数据文件到数据框;pd.read_table(file,sep=’’,names=列名)
默认读取方式读取txt,readlines直接返回完成内容,readline每次只读取一行,需要配合seek、next等完成遍历读取所有记录,read。
示例:fn = open('data.txt', 'r') all_data = fn.readlines() fn.close()
numpy的loadtxt方法,np.loadtxt(file_name,dtype=’’,delimiter=’’)
使用内置的Seaborn数据集,可以使用load_dataset()函数
打开xlsx文件
Pd.read_excel(file_name,sheet_name=)
import xlrd # 导入库 xlsx = xlrd.open_workbook('demo.xlsx')
导出csv文件df.to_csv()
描述性统计,数据审查
查看前几行数据data.head()
数据行列数data.shape
查看数据类型,是否有缺失值data.info()
描述性统计data.describe(include=’all’) include='all'参数可使结果输出所有支持的统计量
数据探索——数据分布情况
各取值计数并降序分布data[‘’].value_counts(ascending=False)
Unique 方法new_data['Brand'].unique()
所有变量直方图分布data.hist(figsize=(12,16),bins=50)
能够自动处理缺失值的模型包括:KNN、决策树和随机森林、神经网络和朴素贝叶斯、DBSCAN(基于密度的带有噪声的空间聚类)
数据清洗
sklearn.preprocessing中的Imputer、Pandas和Numpy
缺失值
丢弃缺失值df.dropna(),inplace=False是否原来基础上替换
data.dropna(thresh=1,subset=['state','IMEI']).count(),两个字段缺失一个的行就删除
使用sklearn将缺失值替换为特定值
nan_model = Imputer(missing_values='NaN', strategy='mean', axis=0) # 建立替换规则:将值为Nan的缺失值以均值做替换,strategy填补策略,most-frequent众数
nan_result = nan_model.fit_transform(df) # 应用模型规则
使用pandas将缺失值替换为特定值df.fillna(method =‘’),backfill用后面的值替换缺失值,pad用前面的值替换缺失值.
df.fillna(df.mean()['col2':'col4']) # 用平均数代替,选择各自列的均值替换缺失值
df2[0] = df2[0].fillna(df2[0].mean())
单变量异常值识别
侦测方法:数据排序、平均值法、四分位法
数值型离群值处理方法:离群值视为空值、盖帽法、变量转换取对数(严重偏态分布的数据取对数)
盖帽法
# Compute boundray.
取对数
data['log_expd']=np.log(tmp+1)
from sklearn.preprocessing import FunctionTransformer
functionTF = FunctionTransformer(np.log1p)
log_data=functionTF.fit_transform(data[['call','traffic']])
类别型处理方法:直接忽略法、人工填补法、自动填补法、推论法
重复值
判断重复数据记录df.duplicated()
删除重复值drop_duplicates(),()可指定重复的列
替换replace()
数据合并merge()
数据预处理——满足模型输入要求
二进制化、离散化、哑编码、标准化、归一化(规范化Normalizer)
二值化
from sklearn.preprocessing import Binarizer
binarizer = Binarizer(threshold=0, copy=True) threshold阈值
data['has_IMEI'] = binarizer.fit_transform(data.IMEI.values.reshape(-1, 1))
等宽离散化pd.cut()可能有空值
from datetime import datetime
dura_col = datetime(2015, 1, 1) - pd.to_datetime(data['join_time'])
data['duration'] = dura_col.map
equal_width = pd.cut(data['duration'], 5)
data['churn'].groupby(equal_width).agg(['count', 'mean','sum'])
人工离散
bins = [-np.inf, 5, 12, 36, np.inf]
artificial_width = pd.cut(data['duration'], bins)
data['churn'].groupby(artificial_width).agg(['mean']).plot(kind='bar')
plt.show()
标准化
from sklearn import preprocessing
from sklearn.preprocessing import scale
scaler = preprocessing.StandardScaler().fit(train_data)
train_scaled = scaler.transform(train_data)
规范化
from sklearn.preprocessing import Normalizer
iris_norm = Normalizer().fit_transform(iris.data)
数据编码
Pandas
dummies = pd.get_dummies(data.state, prefix='s')
data.join(dummies).head()
sklearn.preprocessing中的OneHotEncoder
enc = OneHotEncoder() # 建立模型对象
df2_new = enc.fit_transform(transform_data).toarray() # 标志转换
5、数据降维
主成分分析PCA
from sklearn.decomposition import PCA
iris_pca = PCA(n_components=2)
iris_pca_score = iris_pca.fit_transform(iris.data)
print(iris_pca.explained_variance_ratio_ )可解释方差变异
主成分分析PCA,因子分析FA
# 使用sklearn的DecisionTreeClassifier判断变量重要性
model_tree = DecisionTreeClassifier(random_state=0) # 建立分类决策树模型对象
model_tree.fit(x, y) # 将数据集的维度和目标变量输入模型
feature_importance = model_tree.feature_importances_ # 获得所有变量的重要性得分
print (feature_importance) # 打印输出
特征工程
6、样本不均衡
抽样
过抽样(上采样)增加分类中少数类样本的数量来实现样本均衡,SMOTE算法
欠抽样(下采样)减少分类中多数类样本的数量实现均衡
样本权重熵
使用SVM的权重调节处理不均衡样本
from sklearn.svm import SVC # SVM中的分类算法SVC
model_svm = SVC(class_weight='balanced') # 创建SVC模型对象并指定类别权重
model_svm.fit(x, y) # 输入x和y并训练模型
简单随机抽样、等距抽样、分层抽样、整群抽样
解决共线性问题:增大样本量、岭回归、逐步回归、主成分回归、人工去除
标准化
from sklearn import preprocessing
from sklearn.preprocessing import StandardScaler, scale
实现中心化和正态分布的Z-Score
zscore_scaler = preprocessing.StandardScaler() # 建立StandardScaler对象
data_scale_1 = zscore_scaler.fit_transform(data) # StandardScaler标准化处理
实现归一化的Max-Min
minmax_scaler = preprocessing.MinMaxScaler() # 建立MinMaxScaler模型对象
data_scale_2 = minmax_scaler.fit_transform(data) # MinMaxScaler标准化处理
用于稀疏数据的MaxAbs
离散化
# 针对时间数据的离散化single_data_tmp.weekday() # 离散化为周几
# 针对多值离散数据的离散化
数据分析挖掘
划分测试集训练集
from sklearn.model_selection import train_test_split
train_data, test_data, train_target, test_target = train_test_split(
data, target, test_size=0.2, train_size=0.8, random_state=1234)
聚类
from sklearn.cluster import KMeans # 导入sklearn聚类模块
from sklearn import metrics # 导入sklearn效果评估模块
from sklearn.metrics import silhouette_score 轮廓系数
n_clusters = 3 # 设置聚类数量
model_kmeans = KMeans(n_clusters=n_clusters, n_init=15(初始化次数),random_state=0) # 建立聚类模型对象
tele_kmeans.cluster_centers_聚类中心
model_kmeans.fit(X) # 训练聚类模型
y_pre = model_kmeans.predict(X) # 预测聚类模型
silhouette_s = metrics.silhouette_score(X, y_pre, metric='euclidean') # 平均轮廓系数
交叉验证
from sklearn.model_selection import cross_val_score # 交叉检验
结果验证
import sklearn.metrics as metrics
print(metrics.classification_report(test_target, clf.predirocct(test_data)))
随机森林+GridSearch
随机森林填补缺失值示例
def set_missing_ages(df):
# 把已有的数值型特征取出来丢进Random Forest Regressor中
age_df = df[['Age','Fare', 'Parch', 'SibSp', 'Pclass']]
# 乘客分成已知年龄和未知年龄两部分
known_age = age_df[age_df.Age.notnull()].as_matrix()
unknown_age = age_df[age_df.Age.isnull()].as_matrix()
# y即目标年龄
y = known_age[:, 0]
# X即特征属性值
X = known_age[:, 1:]
# fit到RandomForestRegressor之中
rfr = RandomForestRegressor(random_state=0, n_estimators=2000, n_jobs=-1)
rfr.fit(X, y)
# 用得到的模型进行未知年龄结果预测
predictedAges = rfr.predict(unknown_age[:, 1:])
# print predictedAges
# 用得到的预测结果填补原缺失数据
df.loc[ (df.Age.isnull()), 'Age' ] = predictedAges
return df, rfr
data=add_missing(data)第六部分 数据建模实操
导入常规库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
数据读取
用pandas下的read_csv方法,读取csv文件;pd.read_csv(),如果文件名称包含中文,需要增加engine=’python’
用pandas的read_table方法,读取通用分隔符分割的数据文件到数据框;pd.read_table(file,sep=’’,names=列名)
默认读取方式读取txt,readlines直接返回完成内容,readline每次只读取一行,需要配合seek、next等完成遍历读取所有记录,read。
示例:fn = open('data.txt', 'r') all_data = fn.readlines() fn.close()
numpy的loadtxt方法,np.loadtxt(file_name,dtype=’’,delimiter=’’)
使用内置的Seaborn数据集,可以使用load_dataset()函数
打开xlsx文件
Pd.read_excel(file_name,sheet_name=)
import xlrd # 导入库 xlsx = xlrd.open_workbook('demo.xlsx')
导出csv文件df.to_csv()
描述性统计,数据审查
查看前几行数据data.head()
数据行列数data.shape
查看数据类型,是否有缺失值data.info()
描述性统计data.describe(include=’all’) include='all'参数可使结果输出所有支持的统计量
数据探索——数据分布情况
各取值计数并降序分布data[‘’].value_counts(ascending=False)
Unique 方法new_data['Brand'].unique()
所有变量直方图分布data.hist(figsize=(12,16),bins=50)
能够自动处理缺失值的模型包括:KNN、决策树和随机森林、神经网络和朴素贝叶斯、DBSCAN(基于密度的带有噪声的空间聚类)
数据清洗
sklearn.preprocessing中的Imputer、Pandas和Numpy
缺失值
丢弃缺失值df.dropna(),inplace=False是否原来基础上替换
data.dropna(thresh=1,subset=['state','IMEI']).count(),两个字段缺失一个的行就删除
使用sklearn将缺失值替换为特定值
nan_model = Imputer(missing_values='NaN', strategy='mean', axis=0) # 建立替换规则:将值为Nan的缺失值以均值做替换,strategy填补策略,most-frequent众数
nan_result = nan_model.fit_transform(df) # 应用模型规则
使用pandas将缺失值替换为特定值df.fillna(method =‘’),backfill用后面的值替换缺失值,pad用前面的值替换缺失值.
df.fillna(df.mean()['col2':'col4']) # 用平均数代替,选择各自列的均值替换缺失值
df2[0] = df2[0].fillna(df2[0].mean())
单变量异常值识别
侦测方法:数据排序、平均值法、四分位法
数值型离群值处理方法:离群值视为空值、盖帽法、变量转换取对数(严重偏态分布的数据取对数)
盖帽法
# Compute boundray.
取对数
data['log_expd']=np.log(tmp+1)
from sklearn.preprocessing import FunctionTransformer
functionTF = FunctionTransformer(np.log1p)
log_data=functionTF.fit_transform(data[['call','traffic']])
类别型处理方法:直接忽略法、人工填补法、自动填补法、推论法
重复值
判断重复数据记录df.duplicated()
删除重复值drop_duplicates(),()可指定重复的列
替换replace()
数据合并merge()
数据预处理——满足模型输入要求
二进制化、离散化、哑编码、标准化、归一化(规范化Normalizer)
二值化
from sklearn.preprocessing import Binarizer
binarizer = Binarizer(threshold=0, copy=True) threshold阈值
data['has_IMEI'] = binarizer.fit_transform(data.IMEI.values.reshape(-1, 1))
等宽离散化pd.cut()可能有空值
from datetime import datetime
dura_col = datetime(2015, 1, 1) - pd.to_datetime(data['join_time'])
data['duration'] = dura_col.map
equal_width = pd.cut(data['duration'], 5)
data['churn'].groupby(equal_width).agg(['count', 'mean','sum'])
人工离散
bins = [-np.inf, 5, 12, 36, np.inf]
artificial_width = pd.cut(data['duration'], bins)
data['churn'].groupby(artificial_width).agg(['mean']).plot(kind='bar')
plt.show()
标准化
from sklearn import preprocessing
from sklearn.preprocessing import scale
scaler = preprocessing.StandardScaler().fit(train_data)
train_scaled = scaler.transform(train_data)
规范化
from sklearn.preprocessing import Normalizer
iris_norm = Normalizer().fit_transform(iris.data)
数据编码
Pandas
dummies = pd.get_dummies(data.state, prefix='s')
data.join(dummies).head()
sklearn.preprocessing中的OneHotEncoder
enc = OneHotEncoder() # 建立模型对象
df2_new = enc.fit_transform(transform_data).toarray() # 标志转换
5、数据降维
主成分分析PCA
from sklearn.decomposition import PCA
iris_pca = PCA(n_components=2)
iris_pca_score = iris_pca.fit_transform(iris.data)
print(iris_pca.explained_variance_ratio_ )可解释方差变异
主成分分析PCA,因子分析FA
# 使用sklearn的DecisionTreeClassifier判断变量重要性
model_tree = DecisionTreeClassifier(random_state=0) # 建立分类决策树模型对象
model_tree.fit(x, y) # 将数据集的维度和目标变量输入模型
feature_importance = model_tree.feature_importances_ # 获得所有变量的重要性得分
print (feature_importance) # 打印输出
特征工程
6、样本不均衡
抽样
过抽样(上采样)增加分类中少数类样本的数量来实现样本均衡,SMOTE算法
欠抽样(下采样)减少分类中多数类样本的数量实现均衡
样本权重熵
使用SVM的权重调节处理不均衡样本
from sklearn.svm import SVC # SVM中的分类算法SVC
model_svm = SVC(class_weight='balanced') # 创建SVC模型对象并指定类别权重
model_svm.fit(x, y) # 输入x和y并训练模型
简单随机抽样、等距抽样、分层抽样、整群抽样
解决共线性问题:增大样本量、岭回归、逐步回归、主成分回归、人工去除
标准化
from sklearn import preprocessing
from sklearn.preprocessing import StandardScaler, scale
实现中心化和正态分布的Z-Score
zscore_scaler = preprocessing.StandardScaler() # 建立StandardScaler对象
data_scale_1 = zscore_scaler.fit_transform(data) # StandardScaler标准化处理
实现归一化的Max-Min
minmax_scaler = preprocessing.MinMaxScaler() # 建立MinMaxScaler模型对象
data_scale_2 = minmax_scaler.fit_transform(data) # MinMaxScaler标准化处理
用于稀疏数据的MaxAbs
离散化
# 针对时间数据的离散化single_data_tmp.weekday() # 离散化为周几
# 针对多值离散数据的离散化
数据分析挖掘
划分测试集训练集
from sklearn.model_selection import train_test_split
train_data, test_data, train_target, test_target = train_test_split(
data, target, test_size=0.2, train_size=0.8, random_state=1234)
聚类
from sklearn.cluster import KMeans # 导入sklearn聚类模块
from sklearn import metrics # 导入sklearn效果评估模块
from sklearn.metrics import silhouette_score 轮廓系数
n_clusters = 3 # 设置聚类数量
model_kmeans = KMeans(n_clusters=n_clusters, n_init=15(初始化次数),random_state=0) # 建立聚类模型对象
tele_kmeans.cluster_centers_聚类中心
model_kmeans.fit(X) # 训练聚类模型
y_pre = model_kmeans.predict(X) # 预测聚类模型
silhouette_s = metrics.silhouette_score(X, y_pre, metric='euclidean') # 平均轮廓系数
交叉验证
from sklearn.model_selection import cross_val_score # 交叉检验
结果验证
import sklearn.metrics as metrics
print(metrics.classification_report(test_target, clf.predirocct(test_data)))
随机森林+GridSearch
随机森林填补缺失值示例
def set_missing_ages(df):
# 把已有的数值型特征取出来丢进Random Forest Regressor中
age_df = df[['Age','Fare', 'Parch', 'SibSp', 'Pclass']]
# 乘客分成已知年龄和未知年龄两部分
known_age = age_df[age_df.Age.notnull()].as_matrix()
unknown_age = age_df[age_df.Age.isnull()].as_matrix()
# y即目标年龄
y = known_age[:, 0]
# X即特征属性值
X = known_age[:, 1:]
# fit到RandomForestRegressor之中
rfr = RandomForestRegressor(random_state=0, n_estimators=2000, n_jobs=-1)
rfr.fit(X, y)
# 用得到的模型进行未知年龄结果预测
predictedAges = rfr.predict(unknown_age[:, 1:])
# print predictedAges
# 用得到的预测结果填补原缺失数据
df.loc[ (df.Age.isnull()), 'Age' ] = predictedAges
return df, rfr
data=add_missing(data)