最具影响力的数字化技术在线社区

168大数据

 找回密码
 立即注册

QQ登录

只需一步,快速开始

1 2 3 4 5
打印 上一主题 下一主题
开启左侧

python数据挖掘项目实战记录

[复制链接]
跳转到指定楼层
楼主
发表于 2018-8-21 18:57:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多数据大咖,获取更多知识干货,轻松玩转大数据

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 168主编 于 2018-8-21 19:05 编辑

取自《Python数据分析与挖掘实战》一书,整理各个项目中用到的数据处理方法:

  • 数据预处理方法
  • 建立模型方法
  • 绘制图形

对于分类问题:用模型分类;混淆矩阵及其绘图;观测其ROC曲线;
对于聚类问题:划分类目数;获取划分类目中心;平行坐标系描述


(一)数据预处理的方法

在获取数据之后,会发现一些数据值错误
一、填补空值
二、观察数据分布
三、数据清洗,使数据值都合理存在
四、数据规约,提取重要属性
五、数据归一化,为了使用K-Means算法


数据读取
[AppleScript] 纯文本查看 复制代码
#SVM,bayes,ANN,D_Tree,等需要操作的数据是矩阵,需要
data=data.as_matrix() #将series数据转为矩阵形式的训练集

from numpy.random import shuffle
shuffle(data) #随机打乱数据
x_train=data_train[:,2:]*30 #将特征放大

import pickle
pickle.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)

一、拉格朗日插值法
[AppleScript] 纯文本查看 复制代码
from scipy.interpolate import lagrange
# 取数,两个列表尾接
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的内置插值法
[AppleScript] 纯文本查看 复制代码
df = pd.DataFrame(data, columns=[0, 1, 2])
df.interpolate()

三、电量趋势描述

绘制折线图,观测电量下降趋势。

四、数据探索describe(include=’all).T

通过数据探索,发现异常值,不合逻辑的错误值,如果数据集很大就可以丢弃,否则可以填充

[AppleScript] 纯文本查看 复制代码
explore = data.describe(include='all').T
explore['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))

五、数据清洗

类似集合的操作,对于不合逻辑的错误值,设置索引,排除。

[AppleScript] 纯文本查看 复制代码
data = data[data['SUM_YR_1'].notnull() & data['SUM_YR_2'].notnull()]
index1 = data['SUM_YR_1'] != 0
index2 = data['SUM_YR_2'] != 0
index3 = (data['SEG_KM_SUM'] == 0) & (data['avg_discount'] == 0)
data = data[index1 | index2 | index3]

六、属性转换

数据的规约就是选取有用的数据属性,可以通过excel删除对应列即可实现。

[AppleScript] 纯文本查看 复制代码
# 选取某列
data=data[data['TARGET_ID']==184].copy()  #获取该条件下的数据的副本
data_group=data.groupby('COLLECTTIME')  #以时间分组

def attr_trans(x):  # 定义属性变换函数
    #创建新的series
    result=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] #获取属性值A
    result['CWXT_DB:184:D:\\'] = x['VALUE'].iloc[1] #获取属性值B,等等
    return result

data_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()

八、数据离散化

应用在发掘频繁项时,需要把连续数据转变为离散数据。

[AppleScript] 纯文本查看 复制代码
 for i in range(len(keys)):
        # 调用k-means算法,进行聚类离散化
        r1 = pd.DataFrame(kmodel.cluster_centers_, columns=[typelabel[keys[i]]])  # 聚类中心,A
        r2 = pd.Series(kmodel.labels_).value_counts()  # 分类统计
        r2 = pd.DataFrame(r2, columns=[typelabel[keys[i]] + 'n'])  #统计量, An

        r = 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
平稳性检验,白噪声检验,模型识别,模型检验,模型预测,模型评价,模型应用

十一、行为分析与服务推荐

连接数据库
系统过滤算法为主,其他为辅。

推荐

物品相似度:夹角余弦;杰卡德相似系数;相关系数
熟悉基于物品的协同过滤算法使用

[AppleScript] 纯文本查看 复制代码
# 基于物品的协同过滤算法
def Jaccard(a, b):
    return 1.0 * (a * b).sum() / (a + b - a * b).sum()
class Recommender():
    sim = None
    def similarity(self, x, distance):
        y = np.ones((len(x), len(x)))
        for i in range(len(x)):
            for j in range(len(x)):
                y[i, j] = distance(x[i], x[j])
        return y
    def fit(self, x, distance=Jaccard):  #x传入的是矩阵(行:物品,列:用户)
        self.sim = self.similarity(x, distance) #计算相似度
    def recommend(self, a): #传入预测用户的购买记录的矩阵.T = n * 1
        return np.dot(self.sim, a) * (1 - a)

十二、变量选择与灰色预测

使用Lasso函数对与处理数据变量选择
灰色预测得到关键影响因素的预测值
使用神经网络对财政收入进行预测

十三、文本预处理

[AppleScript] 纯文本查看 复制代码
#数据去重
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 = lambda s: ' '.join(jieba.cut(s)) #自定义简单分词函数
data1 = data1[0].apply(mycut)#对于读入的数据执行分词函数
data2 = data2[0].apply(mycut)#通过“广播”形式分词,加快速度。

#先将文本正负面评价分开,然后再进行LDA主题分析。COSTCM6中的情感分析做及其分类,生成正面情感和负面情感

# 正面主题分析
from gensim import corpora, models
pos_dict = corpora.Dictionary(pos[2])
pos_corpus = [pos_dict.doc2bow(i) for i in pos[2]]
pos_lda = models.LdaModel(pos_corpus, num_topics=3, id2word=pos_dict)
for i in range(3):
    neg_lda.print_topic(i)  # 输出每个主题

(二)、模型方法

一、神经网络
二、决策树
三、K-Means


一、LM神经网络

API:
add(); compile(); fit(); save_weights(); predict_classrs()

[AppleScript] 纯文本查看 复制代码
from keras.models import Sequential
from keras.layers import Dense, Activation
net = Sequential()
net.add(Dense(input_dim=3, activation='relu', units=10))
net.compile(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();

[AppleScript] 纯文本查看 复制代码
# 构建CART决策树模型
from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier()
tree.fit(train[:, :3], train[:, 3])
plt = cm_plot(test[:, 3], tree.predict(test[:, :3]))#获取结果
plt.show()

三、K-Means K聚类算法f

[AppleScript] 纯文本查看 复制代码
from sklearn.cluster import KMeans
import pandas as pd
inputFile = '../data/zscoreddata.xls'
data = pd.read_excel(inputFile)
kmodel = KMeans(n_clusters=5, n_jobs=4)
kmodel.fit(data)
print(kmodel.cluster_centers_)

四、SVM支持向量机

[AppleScript] 纯文本查看 复制代码
from sklearn import svm
smodel=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) :表示推荐的产品,占用户喜欢产品的概率

[AppleScript] 纯文本查看 复制代码
from sklearn.metrics import confusion_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曲线

[AppleScript] 纯文本查看 复制代码
from sklearn.metrics import roc_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='ROC of CART', color='green')  # 作出ROC曲线

聚类群图

[AppleScript] 纯文本查看 复制代码
import matplotlib.pyplot as plt
centers = kmodel.cluster_centers_
for i in range(5):
    plt.plot([2, 4, 6, 8, 10], centers[i], label='group' + str(i),marker='o')  #设置横轴纵轴分别对应5个点
plt.ylabel('values')
plt.xlabel('index: L R F M C')
plt.show()

层次聚类谱图

[AppleScript] 纯文本查看 复制代码
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import linkage,dendrogram
#这里使用scipy的层次聚类函数

Z = linkage(data_udf, method = 'ward', metric = 'euclidean') #谱系聚类图
P = dendrogram(Z, 0) #画谱系聚类图
plt.show()

楼主热帖
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 赞 踩

168大数据 - 论坛版权1.本主题所有言论和图片纯属网友个人见解,与本站立场无关
2.本站所有主题由网友自行投稿发布。若为首发或独家,该帖子作者与168大数据享有帖子相关版权。
3.其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和168大数据的同意,并添加本文出处。
4.本站所收集的部分公开资料来源于网络,转载目的在于传递价值及用于交流学习,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。
5.任何通过此网页连接而得到的资讯、产品及服务,本站概不负责,亦不负任何法律责任。
6.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源,若标注有误或遗漏而侵犯到任何版权问题,请尽快告知,本站将及时删除。
7.168大数据管理员和版主有权不事先通知发贴者而删除本文。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

关于我们|小黑屋|Archiver|168大数据 ( 京ICP备14035423号|申请友情链接

GMT+8, 2024-5-2 13:00

Powered by BI168大数据社区

© 2012-2014 168大数据

快速回复 返回顶部 返回列表