一.数据读取:
- csv文件:csv_data= pd.read_csv(’/路径/test.csv’)
- txt文件:f= open(’/路径/test.txt’, ‘r’)
- 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")
二.数据处理和清洗:
- 数据清洗:
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,则会直接在原数据上进行删除操作,删除后就回不来了。
- 数据类型转换:
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变换可以明显地改善数据的正态性、对称性和方差相等性,对许多实际数据都是行之有效的。
- 数据采样:
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) 定量特征二值化
2) 定性特征哑变量化
3)单一变量的基础转换,比如通过对单一变量进行平方,开根号,log转换等。
4)变量通过添加时间维度进行衍生,比如3个月交易数据,6个月交易数据等
5)多变量的运算,比如两个变量相加,相乘或变量间计算一个比率后得到新变量。
6) 多个变量进行PCA,LDA降维化。
Python sklearn类总结:
https://blog.csdn.net/fuqiuai/article/details/79495865
- 特征选择:当数据预处理完成后,我们需要选择有意义的特征输入机器学习的算法和模型进行训练。首先基于业务理解,选择对因变量有明显影响的特征,要评估特征的获取难度,覆盖率,准确率。然后基于数据层面进行特征选择,通常来说,从两个方面考虑来选择特征:
特征是否发散:如果一个特征不发散,例如方差接近于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模型。
- 特征有效性分析:特征权重分析,监督特征的有效性,防止特征质量下降,影响模型性能。
四. 模型选择