机器学习基础与实践(一)----数据清洗
机器学习基础与实践(二)----数据转换
机器学习基础与实践(三)----数据降维
第二部分特征工程
机器学习基础与实践(四)----特征选择
机器学习基础与实践(五)----特征提取
机器学习基础与实践(六)----模型选择与评估
第三部分算法基础之有监督算法
机器学习基础与实践(七)----广义线性模型
机器学习基础与实践(八)----最小二乘法
机器学习基础与实践(九)----LDA
机器学习基础与实践(十)----SGD
机器学习基础与实践(十一)----K近邻
机器学习基础与实践(十二)----高斯过程
机器学习基础与实践(十三)----决策树(ID3,C4.5,C5.0,CART)
机器学习基础与实践(十四)----朴素贝叶斯
机器学习基础与实践(十五)----支持向量机
机器学习基础与实践(十六)----集成学习(Bagging,RF,AdaBoost,GradientTreeBoosting,VotingClassifier)
机器学习基础与实践(十七)----感知机模型
机器学习基础与实践(十八)----多分类算法
第四部分算法基础之无监督算法
机器学习基础与实践(十九)----K-means
机器学习基础与实践(二十)----Affinitypropagation
机器学习基础与实践(二十一)----Mean-shift
机器学习基础与实践(二十二)----Spectralclustering
机器学习基础与实践(二十三)----Wardhierachical
机器学习基础与实践(二十四)----Agglomerativeclustering
机器学习基础与实践(二十五)----DBSCAN
机器学习基础与实践(二十六)----Gaussianmixtures
机器学习基础与实践(二十七)----Birch
第五部分算法基础之推荐算法
机器学习基础与实践(二十八)----相似度计算
机器学习基础与实践(二十九)----Arules关联规则
机器学习基础与实践(三十)----Fp-Growth
机器学习基础与实践(三十一)----User-basedorItem-based
第六部分算法基础之半监督模型
机器学习基础与实践(三十二)----LabelPropagation
第七部分算法基础之其他模型
机器学习基础与实践(三十三)----概率图模型
机器学习基础与实践(三十四)----最大熵模型
机器学习基础与实践(三十五)----规则学习
机器学习基础与实践(三十六)----强化学习
机器学习基础与实践(三十七)----条件随机场
机器学习基础与实践(三十八)----保序回归(Isotonicregression)
机器学习基础与实践(三十九)----Probabilitycalibration
正文:
直观来看,可以用一个流程图来表示:
今天讲数据清洗,为什么要进行数据清洗呢?我们在书上看到的数据,譬如常见的iris数据集,房价数据,电影评分数据集等等,数据质量都很高,没有缺失值,没有异常点,也没有噪音,而在真实数据中,我们拿到的数据可能包含了大量的缺失值,可能包含大量的噪音,也可能因为人工录入错误导致有异常点存在,对我们挖据出有效信息造成了一定的困扰,所以我们需要通过一些方法,尽量提高数据的质量。数据清洗一般包括以下几个步骤:
1#一组年薪超过10万元的经理收入2pay=c(11,19,14,22,14,28,13,81,12,43,11,16,31,16,23.42,22,26,17,22,13,27,180,16,43,82,14,11,51,76,28,66,29,14,14,65,37,16,37,35,39,27,14,17,13,38,28,40,85,32,25,26,16,12,54,40,18,27,16,14,33,29,77,50,19,34)3par(mfrow=c(2,2))#将绘图窗口改成2*2,可同时显示四幅图4hist(pay)#绘制直方图5dotchart(pay)#绘制点图6barplot(pay,horizontal=T)#绘制箱型图7qqnorm(pay);qqline(pay)#绘制Q-Q图
1importscipyassp2data=sp.genfromtxt("web_traffic.tsv",delimiter="\t")
数据情况如下:
1>>>data2array([[1.00000000e+00,2.27200000e+03],3[2.00000000e+00,nan],4[3.00000000e+00,1.38600000e+03],5...,6[7.41000000e+02,5.39200000e+03],7[7.42000000e+02,5.90600000e+03],8[7.43000000e+02,4.88100000e+03]])910>>>printdata[:10]11[[1.00000000e+002.27200000e+03]12[2.00000000e+00nan]13[3.00000000e+001.38600000e+03]14[4.00000000e+001.36500000e+03]15[5.00000000e+001.48800000e+03]16[6.00000000e+001.33700000e+03]17[7.00000000e+001.88300000e+03]18[8.00000000e+002.28300000e+03]19[9.00000000e+001.33500000e+03]20[1.00000000e+011.02500000e+03]]2122>>>data.shape23(743,2)
可以看到,第2列已经出现了缺失值,现在我们来看一下缺失值的数量:
1>>>x=data[:,0]2>>>y=data[:,1]3>>>sp.sum(sp.isnan(y))48在743个数据里只有8个数据缺失,所以删除它们对于整体数据情况影响不大。当然,这是缺失值少的情况下,在缺失值值比较多,而这个维度的信息还很重要的时候(因为缺失值如果占了95%以上,可以直接去掉这个维度的数据了),直接删除会对后面的算法跑的结果造成不好的影响。我们常用的方法有以下几种:
1.直接删除----适合缺失值数量较小,并且是随机出现的,删除它们对整体数据影响不大的情况
2.使用一个全局常量填充---譬如将缺失值用“Unknown”等填充,但是效果不一定好,因为算法可能会把它识别为一个新的类别,一般很少用
3.使用均值或中位数代替----优点:不会减少样本信息,处理简单。缺点:当缺失数据不是随机数据时会产生偏差.对于正常分布的数据可以使用均值代替,如果数据是倾斜的,使用中位数可能更好。
4.插补法
处理方法:
1.删除异常值----明显看出是异常且数量较少可以直接删除
2.不处理---如果算法对异常值不敏感则可以不处理,但如果算法对异常值敏感,则最好不要用,如基于距离计算的一些算法,包括kmeans,knn之类的。
3.平均值替代----损失信息小,简单高效。
4.视为缺失值----可以按照处理缺失值的方法来处理
1#创建数据,data里包含重复数据2>>>data=pd.DataFrame({'v1':['a']*5+['b']*4,'v2':[1,2,2,2,3,4,4,5,3]})3>>>data4v1v250a161a272a283a294a3105b4116b4127b5138b31415#DataFrame的duplicated方法返回一个布尔型Series,表示各行是否是重复行16>>>data.duplicated()170False181False192True203True214False225False236True247False258False26dtype:bool2728#drop_duplicates方法用于返回一个移除了重复行的DataFrame29>>>data.drop_duplicates()30v1v2310a1321a2334a3345b4357b5368b33738#这两个方法默认会判断全部列,你也可以指定部分列进行重复项判断。假设你还有一列值,且只希望根据v1列过滤重复项:39>>>data['v3']=range(9)40>>>data41v1v2v3420a10431a21442a22453a23464a34475b45486b46497b57508b3851>>>data.drop_duplicates(['v1'])52v1v2v3530a10545b455556#duplicated和drop_duplicates默认保留的是第一个出现的值组合。传入take_last=True则保留最后一个:57>>>data.drop_duplicates(['v1','v2'],take_last=True)58v1v2v3590a10603a23614a34626b46637b57648b38
1list0=['b','c','d','b','c','a','a']23方法1:使用set()45list1=sorted(set(list0),key=list0.index)#sortedoutput6print(list1)78方法2:使用{}.fromkeys().keys()910list2={}.fromkeys(list0).keys()11print(list2)1213方法3:set()+sort()1415list3=list(set(list0))16list3.sort(key=list0.index)17print(list3)1819方法4:迭代2021list4=[]22foriinlist0:23ifnotiinlist4:24list4.append(i)25print(list4)2627方法5:排序后比较相邻2个元素的数据,重复的删除2829defsortlist(list0):30list0.sort()31last=list0[-1]32foriinrange(len(list0)-2,-1,-1):33iflist0[i]==last:34list0.remove(list0[i])35else:36last=list0[i]37returnlist03839print(sortlist(list0))
一般而言,宽度越大,光滑效果越明显。箱也可以是等宽的,其中每个箱值的区间范围是个常量。分箱也可以作为一种离散化技术使用.
2.回归法
可以用一个函数拟合数据来光滑数据。线性回归涉及找出拟合两个属性(或变量)的“最佳”直线,使得一个属性能够预测另一个。多线性回归是线性回归的扩展,它涉及多于两个属性,并且数据拟合到一个多维面。使用回归,找出适合数据的数学方程式,能够帮助消除噪声。
1#-*-coding:utf-8-*-2#文本格式化处理,过滤掉空行34file=open('123.txt')56i=07while1:8line=file.readline().strip()9ifnotline:10break11i=i+112line1=line.replace('\r','')13f1=open('filename.txt','a')14f1.write(line1+'\n')15f1.close()16printstr(i)
2.如何判断文件的编码格式
1#-*-coding:utf8-*-2#批量处理编码格式转换(优化)3importos4importchardet56path1='E://2016txtutf/'7defdirlist(path):8filelist=os.listdir(path)9forfilenameinfilelist:10filepath=os.path.join(path,filename)11ifos.path.isdir(filepath):12dirlist(filepath)13else:14iffilepath.endswith('.txt'):15f=open(filepath)16data=f.read()17ifchardet.detect(data)['encoding']!='utf-8':18printfilepath+"----"+chardet.detect(data)['encoding']1920dirlist(path1)
3.文件编码格式转换,gbk与utf-8之间的转换
这个主要是在一些对文件编码格式有特殊需求的时候,需要批量将gbk的转utf-8的或者将utf-8编码的文件转成gbk编码格式的。
1#-*-coding:gbk-*-2#批量处理编码格式转换3importcodecs4importos5path1='E://dir/'6defReadFile(filePath,encoding="utf-8"):7withcodecs.open(filePath,"r",encoding)asf:8returnf.read()910defWriteFile(filePath,u,encoding="gbk"):11withcodecs.open(filePath,"w",encoding)asf:12f.write(u)1314defUTF8_2_GBK(src,dst):15content=ReadFile(src,encoding="utf-8")16WriteFile(dst,content,encoding="gbk")1718defGBK_2_UTF8(src,dst):19content=ReadFile(src,encoding="gbk")20WriteFile(dst,content,encoding="utf-8")2122defdirlist(path):23filelist=os.listdir(path)24forfilenameinfilelist:25filepath=os.path.join(path,filename)26ifos.path.isdir(filepath):27dirlist(filepath)28else:29iffilepath.endswith('.txt'):30printfilepath31#os.rename(filepath,filepath.replace('.txt','.doc'))32try:33UTF8_2_GBK(filepath,filepath)34exceptException,ex:35f=open('error.txt','a')36f.write(filepath+'\n')37f.close()3839dirlist(path1)