python数据挖掘项目实战记录
取自《Python数据分析与挖掘实战》一书,整理各个项目中用到的数据处理方法:
数据预处理方法建立模型方法绘制图形
对于分类问题:用模型分类;混淆矩阵及其绘图;观测其ROC曲线;
对于聚类问题:划分类目数;获取划分类目中心;平行坐标系描述
(一)数据预处理的方法
在获取数据之后,会发现一些数据值错误
一、填补空值
二、观察数据分布
三、数据清洗,使数据值都合理存在
四、数据规约,提取重要属性
五、数据归一化,为了使用K-Means算法
数据读取
#SVM,bayes,ANN,D_Tree,等需要操作的数据是矩阵,需要data=data.as_matrix()#将series数据转为矩阵形式的训练集fromnumpy.randomimportshuffleshuffle(data)#随机打乱数据x_train=data_train[:,2:]*30#将特征放大importpicklepickle.dump(model,open('../tmp/svm.model','wb'))#保存模型model=pickle.load(open('../tmp/svm.model','rb'))#读取模型#将数据保存为固定文件格式pd.DataFrame(cm_train,index=range(5),columns=range(5)).to_excel(outputfile1)
一、拉格朗日插值法
fromscipy.interpolateimportlagrange#取数,两个列表尾接y=s[list(range(n-k,n))+list(range(n+1,n+1+k))]y=y[y.notnull()]res=lagrange(y.index,list(y))(n)#输入索引,和该列数据n为空值下标
二、series的内置插值法
df=pd.DataFrame(data,columns=[0,1,2])df.interpolate()
三、电量趋势描述
绘制折线图,观测电量下降趋势。
四、数据探索describe(include=’all).T
通过数据探索,发现异常值,不合逻辑的错误值,如果数据集很大就可以丢弃,否则可以填充
explore=data.describe(include='all').Texplore['null']=len(data)-explore['count']explore=explore[['null','max','min','std']]#count,unique,top,freq,mean,std,min,50%,max等选取几个属性#计算相关系数矩阵,data必须是n*n矩阵print(np.round(data.corr(method='pearson'),2))
五、数据清洗
类似集合的操作,对于不合逻辑的错误值,设置索引,排除。
data=data[data['SUM_YR_1'].notnull()&data['SUM_YR_2'].notnull()]index1=data['SUM_YR_1']!=0index2=data['SUM_YR_2']!=0index3=(data['SEG_KM_SUM']==0)&(data['avg_discount']==0)data=data[index1|index2|index3]
六、属性转换
数据的规约就是选取有用的数据属性,可以通过excel删除对应列即可实现。
#选取某列data=data[data['TARGET_ID']==184].copy()#获取该条件下的数据的副本data_group=data.groupby('COLLECTTIME')#以时间分组defattr_trans(x):#定义属性变换函数#创建新的seriesresult=pd.Series(index=['SYS_NAME','CWXT_DB:184:C:\\','CWXT_DB:184:D:\\','COLLECTTIME'])#设置列标result['SYS_NAME']=x['SYS_NAME'].iloc[0]#获取该属性值,唯一result['COLLECTTIME']=x['COLLECTTIME'].iloc[0]#获取该属性值,唯一result['CWXT_DB:184:C:\\']=x['VALUE'].iloc[0]#获取属性值Aresult['CWXT_DB:184:D:\\']=x['VALUE'].iloc[1]#获取属性值B,等等returnresultdata_processed=data_group.apply(attr_trans)#逐组处理
七、数据归一化和标准化
使用正态分布的标准正态分布标准化:x-u/σ
data=(data-data.mean(axis=0))/data.std(axis=0)#按列选取均值和标准差。矩阵操作
当发现数值范围对结果影响太大,不方便运算时,将数据标准化
data=(data-data.min())/(data.max()-data.min())data=data.reset_index()
八、数据离散化
应用在发掘频繁项时,需要把连续数据转变为离散数据。
foriinrange(len(keys)):#调用k-means算法,进行聚类离散化r1=pd.DataFrame(kmodel.cluster_centers_,columns=[typelabel[keys[i]]])#聚类中心,Ar2=pd.Series(kmodel.labels_).value_counts()#分类统计r2=pd.DataFrame(r2,columns=[typelabel[keys[i]]+'n'])#统计量,Anr=pd.DataFrame(pd.concat([r1,r2],axis=1))#聚类中心与类别数目匹配连接r=r.sort_values(typelabel[keys[i]])r.index=[1,2,3,4]r[typelabel[keys[i]]]=pd.rolling_mean(r[typelabel[keys[i]]],2)#rolling_mean()用来计算相邻2列的均值,以此作为边界点。r[typelabel[keys[i]]][1]=0.0#这两句代码将原来的聚类中心改为边界点。result=result.append(r.T)#转置添加result=result.sort_index()#以Index(A,B,C,D,E,F)顺序排序,保存result.to_excel(processedfile)
九、图像切割和颜色矩阵提取
1.一阶颜色矩:采用一阶原点矩,反应图像的整体明暗程度
Ei=1/N*∑(j:1-N)Pij
2.二阶颜色矩:反应图像颜色的分布范围
σi=(1/N*∑j:1-N(Pij-Ei)^2)^1/2
3.三阶颜色矩:反应图像颜色分布的对称性
十、时间序列算法
利用时间序列算法模型的流程,根据历史数据,来预测未来的数据情况
采用时间序列算法对模型输入数据进行模型拟合、检验与检测。依据误差公式,计算预测值与验证数据之间的误差,分析其是否属于业务接受的范围内。
模型识别AR,MA,ARMA
平稳性检验,白噪声检验,模型识别,模型检验,模型预测,模型评价,模型应用
十一、行为分析与服务推荐
连接数据库
系统过滤算法为主,其他为辅。
推荐
物品相似度:夹角余弦;杰卡德相似系数;相关系数
熟悉基于物品的协同过滤算法使用
#基于物品的协同过滤算法defJaccard(a,b):return1.0*(a*b).sum()/(a+b-a*b).sum()classRecommender():sim=Nonedefsimilarity(self,x,distance):y=np.ones((len(x),len(x)))foriinrange(len(x)):forjinrange(len(x)):y[i,j]=distance(x[i],x[j])returnydeffit(self,x,distance=Jaccard):#x传入的是矩阵(行:物品,列:用户)self.sim=self.similarity(x,distance)#计算相似度defrecommend(self,a):#传入预测用户的购买记录的矩阵.T=n*1returnnp.dot(self.sim,a)*(1-a)
十二、变量选择与灰色预测
使用Lasso函数对与处理数据变量选择
灰色预测得到关键影响因素的预测值
使用神经网络对财政收入进行预测
十三、文本预处理
#数据去重l1=len(data)data=pd.DataFrame(data[0].unique())#选取数据列进行unique()l2=len(data)data.to_csv(outputfile,index=False,header=False,encoding='utf-8')print(u'删除了%s条评论。'%(l1-l2))#机械压缩去词,去除连续重复语料,和短句子删除过滤较多垃圾信息#文本评论分词mycut=lambdas:''.join(jieba.cut(s))#自定义简单分词函数data1=data1[0].apply(mycut)#对于读入的数据执行分词函数data2=data2[0].apply(mycut)#通过“广播”形式分词,加快速度。#先将文本正负面评价分开,然后再进行LDA主题分析。COSTCM6中的情感分析做及其分类,生成正面情感和负面情感#正面主题分析fromgensimimportcorpora,modelspos_dict=corpora.Dictionary(pos[2])pos_corpus=[pos_dict.doc2bow(i)foriinpos[2]]pos_lda=models.LdaModel(pos_corpus,num_topics=3,id2word=pos_dict)foriinrange(3):neg_lda.print_topic(i)#输出每个主题
(二)、模型方法
一、神经网络
二、决策树
三、K-Means
一、LM神经网络
API:
add();compile();fit();save_weights();predict_classrs()
fromkeras.modelsimportSequentialfromkeras.layersimportDense,Activationnet=Sequential()net.add(Dense(input_dim=3,activation='relu',units=10))pile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])net.fit(train[:,:3],train[:,3],epochs=1000,batch_size=1)#传入的是矩阵,读取excel需要把数据.as_matrix()net.save_weights(netfile)predict_result=net.predict_classes(train[:,:3]).reshape(len(train))
二、CART决策树
API:
fit();predict();
#构建CART决策树模型fromsklearn.treeimportDecisionTreeClassifiertree=DecisionTreeClassifier()tree.fit(train[:,:3],train[:,3])plt=cm_plot(test[:,3],tree.predict(test[:,:3]))#获取结果plt.show()
三、K-MeansK聚类算法
fromsklearn.clusterimportKMeansimportpandasaspdinputFile='../data/zscoreddata.xls'data=pd.read_excel(inputFile)kmodel=KMeans(n_clusters=5,n_jobs=4)kmodel.fit(data)print(kmodel.cluster_centers_)
四、SVM支持向量机
fromsklearnimportsvmsmodel=svm.SVC()#建立模型smodel.fit(x_train,y_train)#训练模型res=smodel.predict(x_test)#预测测试集
(三)、绘制图形
模型建立后,需要可视化分析数据挖掘的合理性,准确性等
混淆矩阵:正确与错误分类的情况
ROC曲线:分类方法的性能
聚类群图:使数据值聚成n类,分析n类群体特征
混淆矩阵
预测准确度:RMSE;MAE
分类准确度:precesion=TP/TP+FP:表示用户对推荐产品感兴趣的可能性
recall=TP/(TP+FN):表示推荐的产品,占用户喜欢产品的概率
fromsklearn.metricsimportconfusion_matrix#导入混淆矩阵函数cm=confusion_matrix(y,yp)#混淆矩阵如下#CM[[TP,FP],[FN,TN]]#例如['TP','FP','FN','TN']==[46,2,7,4]cm_train=confusion_matrix(train_label,smodel.predict(trainSet))cm_test=confusion_matrix(test_label,smodel.predict(testSet))pd.DataFrame(cm_train).to_excel(outFile1)pd.DataFrame(cm_test).to_excel(outFile2)
ROC曲线
fromsklearn.metricsimportroc_curve#导入ROC曲线函数fpr,tpr,thresholds=roc_curve(test[:,3],tree.predict_proba(test[:,:3])[:,1],pos_label=1)plt.plot(fpr,tpr,linewidth=2,label='ROCofCART',color='green')#作出ROC曲线
聚类群图
importmatplotlib.pyplotaspltcenters=kmodel.cluster_centers_foriinrange(5):plt.plot([2,4,6,8,10],centers[i],label='group'+str(i),marker='o')#设置横轴纵轴分别对应5个点plt.ylabel('values')plt.xlabel('index:LRFMC')plt.show()
层次聚类谱图
importmatplotlib.pyplotaspltfromscipy.cluster.hierarchyimportlinkage,dendrogram#这里使用scipy的层次聚类函数Z=linkage(data_udf,method='ward',metric='euclidean')#谱系聚类图P=dendrogram(Z,0)#画谱系聚类图plt.show()