https://mp.weixin.qq.com/s/mtU-58ZPW9ruOj7H16zpVQ
<https://mp.weixin.qq.com/s/mtU-58ZPW9ruOj7H16zpVQ>

 

一.数据读取:

 

1.    csv文件:csv_data= pd.read_csv('/路径/test.csv')

2.    txt文件:f= open('/路径/test.txt', 'r')

3.    excel文件:

import xlrd

f=xlrd.open_workbook(r'\路径\demo.xlsx',formatting_info=True)

table =data.sheet_by_name("Sheet2")

or

df = pd.read_excel("\路径\window regulator.xlsx",sheetname="Sheet2")

 

二.数据处理和清洗:

 

1.    数据清洗:

A.调整数值及格式,去掉噪声,不可信值,缺失值较多的字段

1)去掉空格,换行符:

" xyz ".strip() # returns "xyz"

" xyz ".lstrip() # returns "xyz "

" xyz ".rstrip() # returns " xyz"

" x y z ".replace(' ', '') # returns "xyz"

2)用split断开再合上 ''.join(your_str.split())

3)用正则表达式来完毕替换: import re strinfo = re.compile('word') b =
strinfo.sub('python',a)print b 输出的结果也是hello python

4)删除pandas DataFrame的某一/几列:

方法一:直接del DF['column-name']

方法二:采用drop方法,有下面三种等价的表达式:

i. DF= DF.drop('column_name', 1);

ii. DF.drop('column_name',axis=1,inplace=True)

iii. DF.drop([DF.columns[[0,1, 3]]],axis=1,inplace=True)  

5)删除DataFrame某行

DataFrame.drop(labels=None,axis=0,index=None,columns=None, inplace=False) 


在这里默认:axis=0,指删除index,因此删除columns时要指定axis=1;inplace=False,默认该删除操作不改变原数据,而是返回一个执行删除操作后的新dataframe;inplace=True,则会直接在原数据上进行删除操作,删除后就回不来了。

6) 数据类型转换:



 

B.归一化处理,离散化处理,数据变换(log,0-1,exp,box-cox):

 

1)0-1标准化:这是最简单也是最容易想到的方法,通过遍历feature
vector里的每一个数据,将Max和Min的记录下来,并通过Max-Min作为基数(即Min=0,Max=1)进行数据的归一化处理。

def MaxMinNormalization(x,Max,Min):

x = (x - Min) / (Max - Min);

     return x;

 

2)Z-score标准化:这种方法给予原始数据的均值(mean)和标准差(standard
deviation)进行数据的标准化。经过处理的数据符合标准正态分布,即均值为0,标准差为1,这里的关键在于复合标准正态分布,个人认为在一定程度上改变了特征的分布。

def Z_ScoreNormalization(x,mu,sigma):

     x = (x - mu) / sigma;

     return x;

 

3)Sigmoid函数:Sigmoid函数是一个具有S形曲线的函数,是良好的阈值函数,且在(0, 0.5)处中心对称,在(0,
0.5)附近有比较大的斜率,而当数据趋向于正无穷和负无穷的时候,映射出来的值就会无限趋向于1和0,是个人非常喜欢的“归一化方法”,之所以打引号是因为我觉得Sigmoid函数在阈值分割上也有很不错的表现,根据公式的改变,就可以改变分割阈值,这里作为归一化方法,我们只考虑(0,
0.5)作为分割阈值的点的情况:

def sigmoid(X,useStatus):

     if useStatus:

            return 1.0 / (1 +np.exp(-float(X)));

     else:

            return float(X);

 


4)变换数据范围:除了上述介绍的方法之外,另一种常用的方法是将属性缩放到一个指定的最大和最小值(通常是1-0)之间,这可以通过preprocessing.MinMaxScaler类实现。

X_std=(X-X.min(axis=0))/(X.max(axis=0)-X.min(axis=0))

X_scaled=X_std/(max-min)+min

 


5)正则化:正则化的过程是将每个样本缩放到单位范数(每个样本的范数为1),如果后面要使用如二次型(点积)或者其它核方法计算两个样本之间的相似性这个方法会很有用。正则化的主要思想是对每个样本计算其p-范数,然后对该样本中每个元素除以该范数,这样处理的结果是使得每个处理后样本的p-范数(l1-norm,l2-norm)等于1。

 

             p-范数的计算公式:||X||p=(|x1|^p+|x2|^p+...+|xn|^p)^1/p

 


该方法主要应用于文本分类和聚类中。例如,对于两个TF-IDF向量的l2-norm进行点积,就可以得到这两个向量的余弦相似性。可以使用preprocessing.normalize()函数对指定数据进行转换,用processing.Normalizer()类实现对训练集和测试集的拟合和转换。

 


6)Box-cox变换(stats.boxcox):Box-Cox变换是Box和Cox在1964年提出的一种广义幂变换方法,是统计建模中常用的一种数据变换,用于连续的响应变量不满足正态分布的情况。Box-Cox变换之后,可以一定程度上减小不可观测的误差和预测变量的相关性。Box-Cox变换的主要特点是引入一个参数,通过数据本身估计该参数进而确定应采取的数据变换形式,Box-Cox变换可以明显地改善数据的正态性、对称性和方差相等性,对许多实际数据都是行之有效的。

 

2.    数据采样:

 

A.无放回的抽样 
使用 random.sample

import random

idxTest = random.sample(range(nPoints),nSample)      

#得到的idxTest 是一个list形式

 

B.有放回的抽样 
使用 random.choice (一次选一个)

BagSamples=50

for i in range(nBagSamples):

    idxBag.append(np.random.choice(range(len(xTrain))))

#choice直接选出的不是list

 

更多方法详见pandas.DataFrame.resample

 

三.特征工程:

1.    特征处理:数值型,类别型,时间型,文本型,统计型,组合特征,特征衍生,如:

1) 定量特征二值化

2) 定性特征哑变量化

3)单一变量的基础转换,比如通过对单一变量进行平方,开根号,log转换等。

4)变量通过添加时间维度进行衍生,比如3个月交易数据,6个月交易数据等5)多变量的运算,比如两个变量相加,相乘或变量间计算一个比率后得到新变量。

6) 多个变量进行PCA,LDA降维化。

 

Python sklearn类总结:

 



 


2.    特征选择:当数据预处理完成后,我们需要选择有意义的特征输入机器学习的算法和模型进行训练。首先基于业务理解,选择对因变量有明显影响的特征,要评估特征的获取难度,覆盖率,准确率。然后基于数据层面进行特征选择,通常来说,从两个方面考虑来选择特征:

*
特征是否发散:如果一个特征不发散,例如方差接近于0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么用。

*
特征与目标的相关性:这点比较显见,与目标相关性高的特征,应当优选选择。除移除低方差法外,本文介绍的其他方法均从相关性考虑。

特征选择主要有两个目的:一是减少特征数量、降维,使模型泛化能力更强,减少过拟合;二是增强对特征和特征值之间的理解。

根据特征选择的形式又可以将特征选择方法分为3种:

 


A.过滤型:按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。sklearn.feature_selection.SelectKBest

 

1)方差选择法


使用方差选择法,先要计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征。使用feature_selection库的VarianceThreshold类来选择特征。

2)相关系数法

使用相关系数法,先要计算各个特征对目标值的相关系数以及相关系数的P值。用feature_selection库的SelectKBest类结合相关系数来选择特征。

3)卡方检验


经典的卡方检验是检验定性自变量对定性因变量的相关性。假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望的差距,构建统计量:



这个统计量的含义简而言之就是自变量对因变量的相关性。用feature_selection库的SelectKBest类结合卡方检验来选择特征。

4)互信息法

经典的互信息也是评价定性自变量对定性因变量的相关性的,互信息计算公式如下:



为了处理定量数据,最大信息系数法被提出,使用feature_selection库的SelectKBest类结合最大信息系数法来选择特征。 

 


B.包裹型:根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。递归特征消除法:递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。使用feature_selection库的RFE类来选择特征。

 

C.嵌入型:先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于过滤法,但是是通过训练来确定特征的优劣。

 

1)基于惩罚项的特征选择法


使用带惩罚项的基模型,除了筛选出特征外,同时也进行了降维。使用feature_selection库的SelectFromModel类结合带L1惩罚项的逻辑回归模型。

2)基于树模型的特征选择法

树模型中GBDT也可用来作为基模型进行特征选择,使用feature_selection库的SelectFromModel类结合GBDT模型。

 

3.    特征有效性分析:特征权重分析,监督特征的有效性,防止特征质量下降,影响模型性能。

 

四. 模型选择