2017-06-25 22:41:00 diaozhu1028 阅读数 7
  • Python数据挖掘实战

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 Python数据挖掘技术系列视频培训教程基于真实数据集进行案例实战,使用Python数据科学库从数据预处理开始一步步进行数据建模。对于每个案例首先进行流程解读与数据分析,建立特征工程,详细解读其中每一步原理与应用。该课程共有十一大章节,88课时,从泰坦尼克号获救预测进行数据分析作为第一章节,后边依次是用户画像、Xgboost实战、京东用户购买意向预测、Kaggle数据科学调查、房价预测、论文与BenchMark的意义、Python实现音乐推荐系统、fbprophet时间序列预测、用电敏感客户分类、数据特征。

    4689 人正在学习 去看看 唐宇迪

分享

知识要点:
lubridate包拆解时间 | POSIXlt
利用决策树分类,利用随机森林预测
利用对数进行fit,和exp函数还原

训练集来自Kaggle华盛顿自行车共享计划中的自行车租赁数据,分析共享自行车与天气、时间等关系。数据集共11个变量,10000多行数据。
https://www.kaggle.com/c/bike-sharing-demand

首先看一下官方给出的数据,一共两个表格,都是2011-2012年的数据,区别是Test文件是每个月的日期都是全的,但是没有注册用户和随意用户。而Train文件是每个月只有1-20天,但有两类用户的数量。
求解:补全Train文件里21-30号的用户数量。评价标准是预测与真实数量的比较。


1.png

首先加载文件和包

library(lubridate)
library(randomForest)

library(readr)
setwd("E:")
data<-read_csv("train.csv")
head(data)

这里我就遇到坑了,用r语言缺省的read.csv死活读不出来正确的文件格式,换成xlsx更惨,所有时间都变成43045这样的怪数字。本来之前试过as.Date可以正确转换,但这次因为有时分秒,就只能用时间戳,但结果也不行。
最后是下载了"readr"包,用read_csv语句,顺利解读。
因为test比train日期完整,但缺少用户数,所以要把train和test合并。

test$registered=0
test$casual=0
test$count=0
data<-rbind(train,test)

摘取时间:可以用时间戳,这里的时间比较简单,就是小时数,所以也可以直接截字符串。

data$hour1<-substr(data$datetime,12,13)
table(data$hour1)

统计一下每个小时的使用总数,是这样(为什么介么整齐):


6-hour1.png

接下来是运用箱线图,看一下使用者和时间,周几这些的关系。为什么用箱线图而不用hist直方图,因为箱线图有离散点表达,下面也因此运用对数求fit
从图中可以看出,在时间方面,注册用户和非注册用户的使用时间有很大不同。


5-hour-regestered.png

5-hour-casual.png

4-boxplot-day.png

接下来用相关系数cor检验用户,温度,体感温度,湿度,风速的关系。

相关系数:变量之间的线性关联度量,检验不同数据的相关程度。
取值范围[-1,1],越接近0越不相关。

从运算结果可以看出,使用人群与风速呈负相关,比温度影响还大。


cor.png

接下来就是将时间等因素用决策树分类,然后用随机森林来预测。随机森林和决策树的算法。听起来很高大上,其实现在也很常用了,所以一定要学会。

决策树模型是 一种简单易用的非参数分类器。它不需要对数据有任何的先验假设,计算速度较快,结果容易解释,而且稳健性强,不怕噪声数据和缺失数据。
决策树模型的基本计 算步骤如下:先从n个自变量中挑选一个,寻找最佳分割点,将数据划分为两组。针对分组后数据,将上述步骤重复下去,直到满足某种条件。
在决策树建模中需要解决的重要问题有三个:
如何选择自变量
如何选择分割点
确定停止划分的条件

做出注册用户和小时的决策树,

train$hour1<-as.integer(train$hour1)
d<-rpart(registered~hour1,data=train)
rpart.plot(d)

3-raprt-hour1.png


然后就是根据决策树的结果手动分类,所以还满占代码的...

train$hour1<-as.integer(train$hour1)
data$dp_reg=0
data$dp_reg[data$hour1<7.5]=1
data$dp_reg[data$hour1>=22]=2
data$dp_reg[data$hour1>=9.5 & data$hour1<18]=3
data$dp_reg[data$hour1>=7.5 & data$hour1<18]=4
data$dp_reg[data$hour1>=8.5 & data$hour1<18]=5
data$dp_reg[data$hour1>=20 & data$hour1<20]=6
data$dp_reg[data$hour1>=18 & data$hour1<20]=7

同理,做出 (小时 | 温度) X (注册 | 随意用户) 等决策树,继续手动分类....


3-raprt-temp.png

年份月份,周末假日等手动分类

data$year_part=0
data$month<-month(data$datatime)
data$year_part[data$year=='2011']=1
data$year_part[data$year=='2011' & data$month>3]=2
data$year_part[data$year=='2011' & data$month>6]=3
data$year_part[data$year=='2011' & data$month>9]=4
data$day_type=""
data$day_type[data$holiday==0 & data$workingday==0]="weekend"
data$day_type[data$holiday==1]="holiday"
data$day_type[data$holiday==0 & data$workingday==1]="working day"
data$weekend=0
data$weekend[data$day=="Sunday"|data$day=="Saturday"]=1

接下来用随机森林语句预测

在机器学习中,随机森林是一个包含多个决策树的分类器, 并且其输出的类别是由个别树输出的类别的众数而定。
随机森林中的子树的每一个分裂过程并未用到所有的待选特征,而是从所有的待选特征中随机选取一定的特征,再在其中选取最优的特征。这样决策树都能够彼此不同,提升系统的多样性,从而提升分类性能。

ntree指定随机森林所包含的决策树数目,默认为500,通常在性能允许的情况下越大越好;
mtry指定节点中用于二叉树的变量个数,默认情况下数据集变量个数的二次方根(分类模型)或三分之一(预测模型)。一般是需要进行人为的逐次挑选,确定最佳的m值—摘自datacruiser笔记。这里我主要学习,所以虽然有10000多数据集,但也只定了500。就这500我的小电脑也跑了半天。

train<-data
set.seed(1234)
train$logreg<-log(train$registered+1)
test$logcas<-log(train$casual+1)

fit1<-randomForest(logreg~hour1+workingday+day+holiday+day_type+temp_reg+humidity+atemp+windspeed+season+weather+dp_reg+weekend+year+year_part,train,importance=TRUE,ntree=250)

pred1<-predict(fit1,train)
train$logreg<-pred1

这里不知道怎么回事,我的day和day_part加进去就报错,只有删掉这两个变量计算,还要研究修补。
然后用exp函数还原

train$registered<-exp(train$logreg)-1
train$casual<-exp(train$logcas)-1
train$count<-test$casual+train$registered

最后把20日后的日期截出来,写入新的csv文件上传。

train2<-train[as.integer(day(data$datetime))>=20,]
submit_final<-data.frame(datetime=test$datetime,count=test$count)
write.csv(submit_final,"submit_final.csv",row.names=F)

大功告成!
github代码加群

原来的示例是炼数成金网站的kaggle课程第二节,基本按照视频的思路。因为课程没有源代码,所以要自己修补运行完整。历时两三天总算把这个功课做完了。下面要修正的有:

好好理解三个知识点(lubridate包/POSIXlt,log线性,决策树和随机森林);
用WOE和IV代替cor函数分析相关关系;
用其他图形展现的手段分析
随机树变量重新测试

学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入学习交流群
626062078,我们一起学Python!

完成了一个“浩大完整”的数据分析,还是很有成就感的!

转载于:https://www.cnblogs.com/jiaoyu121/p/7078355.html

2018-06-12 18:11:12 jianghuming 阅读数 404
  • Python数据挖掘实战

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 Python数据挖掘技术系列视频培训教程基于真实数据集进行案例实战,使用Python数据科学库从数据预处理开始一步步进行数据建模。对于每个案例首先进行流程解读与数据分析,建立特征工程,详细解读其中每一步原理与应用。该课程共有十一大章节,88课时,从泰坦尼克号获救预测进行数据分析作为第一章节,后边依次是用户画像、Xgboost实战、京东用户购买意向预测、Kaggle数据科学调查、房价预测、论文与BenchMark的意义、Python实现音乐推荐系统、fbprophet时间序列预测、用电敏感客户分类、数据特征。

    4689 人正在学习 去看看 唐宇迪

Python大数据分析_开篇

目前在网上看了很多博客,都是一些关于数据处理的,且都浅尝辄止,没有形成一个系列,只言片语,不能给人以更深层次的启发。加之,最近在用python做金融大数据这块的分析,故写博客以记之,以供他人阅,相互交流。

大数据分析的意义,我自不用多述。众多金融公司,无不在挖掘其价值。但是公开的,没有任何一个模型是成功的,私下赚钱的算法系统,也不会公开。这便是我们的目标之一。

不仅金融公司在做大数据分析,众多其它类别的公司,也都在数据分析,房地产(如某壳),餐饮,电力等等,各行各业,都在做数据分析。提取有价值的信息,便可以给公司指明道路,给领导以决策。

接下来,本人会把自己的研究,分享给大家,欢迎批评指正。


2015-02-09 13:50:18 u014036026 阅读数 13722
  • Python数据挖掘实战

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 Python数据挖掘技术系列视频培训教程基于真实数据集进行案例实战,使用Python数据科学库从数据预处理开始一步步进行数据建模。对于每个案例首先进行流程解读与数据分析,建立特征工程,详细解读其中每一步原理与应用。该课程共有十一大章节,88课时,从泰坦尼克号获救预测进行数据分析作为第一章节,后边依次是用户画像、Xgboost实战、京东用户购买意向预测、Kaggle数据科学调查、房价预测、论文与BenchMark的意义、Python实现音乐推荐系统、fbprophet时间序列预测、用电敏感客户分类、数据特征。

    4689 人正在学习 去看看 唐宇迪

适合初学入门

第一课 构造数据

本节基本了解Pandas里的一些数据结构和模块的基本使用,初步了解Pandas的提供的一些功能,学会基本使用。

创建数据

通过Python的zip构造出一元组组成的列表作为DataFrame的输入数据rec。


In [3]: import pandas as pd
In [4]: import random
In [5]: num = random.sample(xrange(10000, 1000000), 5)
In [6]: num
Out[6]: [244937, 132008, 278446, 613409, 799201]
In [8]: names = "hello the cruel world en".split()
In [9]: names
Out[9]: ['hello', 'the', 'cruel', 'world', 'en']
In [10]: rec = zip(names, num)
In [15]: data = pd.DataFrame(rec, columns = [u"姓名",u"业绩" ])
In [16]: data
Out[16]:
     姓名  业绩
0    hello   244937
1    the     132008
2    cruel   278446
3    world   613409
4    en      799201 

DataFrame方法函数的第一个参数是数据源,第二个参数columns是输出数据表的表头,或者说是表格的字段名。


导出数据csv

Windows平台上的编码问题,我们可以先做个简单处理,是ipython-notebook支持utf8.

import sys
reload(sys)
sys.setdefaultencoding("utf8")

接下来可以数据导出了。

In [31]: data
Out[31]:
     姓名  业绩
0    hello   244937
1    the     132008
2    cruel   278446
3    world   613409
4    en      799201 
#在ipython-note里后加问号可查帮助,q退出帮助
In [32]: data.to_csv?
In [33]: data.to_csv("c:\\out.csv", index = True, header = [u"雇员", u"销售业绩"])

将data导出到out.csv文件里,index参数是指是否有主索引,header如果不指定则是以data里columns为头,如果指定则是以后边列表里的字符串为表头,但要注意的是header后的字符串列表的个数要和data里的columns字段个数相同。



可到c盘用Notepad++打开out.csv看看。

简单的数据分析

In [43]: data
Out[43]:
     姓名  业绩
0    hello   244937
1    the     132008
2    cruel   278446
3    world   613409
4    en      799201
#排序并取前三名
In [46]: Sorted = data.sort([u"业绩"], ascending=False)
         Sorted.head(3)
Out[46]:
     姓名  业绩
4    en      799201
3    world   613409
2    cruel   278446


图形输出

In [71]: import matplotlib.pyplot as plt
         #使ipython-notebook支持matplotlib绘图
         %matplotlib inline
In [74]: df = data
         #绘图
         df[u"业绩"].plot()
         MaxValue = df[u"业绩"].max()
         MaxName = df[u"姓名"][df[u"业绩"] == df[u"业绩"].max()].values
         Text = str(MaxValue) + " - " + MaxName
         #给图添加文本标注
         plt.annotate(Text, xy=(1, MaxValue), xytext=(8, 0), xycoords=('axes fraction', 'data'), textcoords='offset points')


如果注释掉plt.annotate这行,结果如下所示:









2018-05-24 19:50:48 qq_39343820 阅读数 165
  • Python数据挖掘实战

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 Python数据挖掘技术系列视频培训教程基于真实数据集进行案例实战,使用Python数据科学库从数据预处理开始一步步进行数据建模。对于每个案例首先进行流程解读与数据分析,建立特征工程,详细解读其中每一步原理与应用。该课程共有十一大章节,88课时,从泰坦尼克号获救预测进行数据分析作为第一章节,后边依次是用户画像、Xgboost实战、京东用户购买意向预测、Kaggle数据科学调查、房价预测、论文与BenchMark的意义、Python实现音乐推荐系统、fbprophet时间序列预测、用电敏感客户分类、数据特征。

    4689 人正在学习 去看看 唐宇迪

学习完《利用python进行数据分析》之后,看到R语言案例中的定位算法一章时,试着用python进行分析一下。

一、数据准备

原始数据有两份:offline.final.trace.txt和online.final.trace.txt

原始数据:


最后处理完成的结果:


二、python处理

在ipython notebook里面进行分析

首先对一行数据进行处理:

预处理,去除带有#的行,这是无用数据

with open('G:\Positioning\online.final.trace.txt','r') as r:
    lines = r.readlines()
with open('G:\Positioning\online.final.trace.txt','w') as w:
    for l in lines:
        if '#' not in l:
            w.write(l)  #去除带有‘#’字符的行

打开文件,这里是测试数据,就只有一行

f = open('G:\Positioning\Positioning.txt')
data = f.read()

利用正则表达式,分离数据

import re
tokens = re.split('[=;,]',data) #正则表达式,分离各个元素,根据‘=’,‘;’,‘,’这三个字符对数据进行分离出来放在一个列表中

将数据分成2个部分,一部分是前面的测量单元,另一部分是后面的读数

import pandas as pd
import numpy as np
from pandas import Series, DataFrame #引入约定 
columns1 = [tokens[0],tokens[2],'posX','posY','posZ',tokens[8]] #得到第一部分数据的列表名
data1 = [tokens[1],tokens[3],tokens[5],tokens[6],tokens[7],tokens[9]] #得到第一部分的数据
s = Series(data1, index = columns1) #第一部分的Series
df1 = DataFrame(s).T #第一部分数据的DataFrame

a = tokens[10:] #第二部分的数据
columns2 = ['MAC','signal','frequency','mode']  #第二部分数据的列名
def chunks(s, step):
    return [s[i:i+step] for i in  range(0, len(s), step)] #函数:遍历列表,取n个元素为一个新元素
data2 = chunks(a, 4) #每四个一组
df2 = DataFrame(data2, columns = columns2 ) #第二部分数据的DataFrame

合并两个DataFrame,完成对一行数据的处理

df1['key'] ='1' #增添一个公共键
df2['key'] ='1'
df=pd.merge(df1,df2) #合并

对数据集进行处理(多行):

预处理:

with open('G:\Positioning\online.final.trace.txt','r') as r:
    lines = r.readlines()
with open('G:\Positioning\online.final.trace.txt','w') as w:
    for l in lines:
        if '#' not in l:
            w.write(l) 
#删除含有#的行

编写函数,根据单行的步骤来编写:

import pandas as pd
import numpy as np
from pandas import Series, DataFrame 

def function(x): #编写函数
    import re
    import pandas as pd
    import numpy as np
    from pandas import Series, DataFrame 
    tokens = re.split('[=;,]',x) #分离各个元素
    
    columns1 = [tokens[0],tokens[2],'posX','posY','posZ',tokens[8]] #得到第一部分的列表名
    data1 = [tokens[1],tokens[3],tokens[5],tokens[6],tokens[7],tokens[9]] #得到第一部分的数据
    s = Series(data1, index = columns1) #第一部分的Series
    df1 = DataFrame(s).T #第一部分的DataFrame
    
    a = tokens[10:] #第二部分的数据
    columns2 = ['MAC','signal','frequency','mode'] 
    def chunks(s, step):
         return [s[i:i+step] for i in  range(0, len(s), step)]
    data2 = chunks(a, 4) #每四个一组
    df2 = DataFrame(data2, columns = columns2 )
    
    df1['key'] ='1' #增添公共键
    df2['key'] ='1'
    
    df=pd.merge(df1,df2) #合并
    
    return df

打开文件,进行数据处理

f = open('G:\Positioning\online.final.trace.txt')
lines = [line.strip('\n') for line in f] #去掉换行符
frames=[] #先设置空的列表
for i in lines:
    frames.append(function(i)) #将lines中每个元素进行应用函数后添加到列表中
df = pd.concat(frames, ignore_index = True) #无视索引,重新编号

对原始数据的处理目前到这里以及完成的差不多了。大家如果还有更加节省资源的代码,欢迎指教指教,小白一枚,不胜感激。







2019-01-02 19:05:28 weixin_39667003 阅读数 3108
  • Python数据挖掘实战

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 Python数据挖掘技术系列视频培训教程基于真实数据集进行案例实战,使用Python数据科学库从数据预处理开始一步步进行数据建模。对于每个案例首先进行流程解读与数据分析,建立特征工程,详细解读其中每一步原理与应用。该课程共有十一大章节,88课时,从泰坦尼克号获救预测进行数据分析作为第一章节,后边依次是用户画像、Xgboost实战、京东用户购买意向预测、Kaggle数据科学调查、房价预测、论文与BenchMark的意义、Python实现音乐推荐系统、fbprophet时间序列预测、用电敏感客户分类、数据特征。

    4689 人正在学习 去看看 唐宇迪

 使用python进行数据处理的实例(数据为某公司HR部门关于员工信息的部分摘录,kaggle上面的一次赛题)

https://www.kaggle.com/c/kfru-dbm-hr-analytics

该实例是根据其他所给属性预测员工是否会离职,代码实现如下所示

import pandas as pd
from sklearn.preprocessing import MinMaxScaler,StandardScaler
from sklearn.preprocessing import LabelEncoder,OneHotEncoder
from sklearn.decomposition import PCA

def hr_preprocessing(sl=False,le=False,npr=False,amh=False,tsc=False,wa=False,pl5=False,dp=False,slr=False,lower_id=False,ld_n=1):
    df=pd.read_csv('C:\\Users\\Administrator\Desktop\\network\\HR.csv')
    #1 清洗数据,根据探索性数据分析出的结果来去掉空值
    df=df.dropna(subset=['satisfaction_level','last_evaluation'])
    df=df[df['satisfaction_level']<=1][df['salary']!='nme']

    #2 得到标注
    label=df['left']
    df=df.drop('left',axis=1)

    #3 特征选择(因为本文的特征本来就不多,暂时不做)

    # 4 特征处理(归一化,标准化,降维)
    scaler_lst=[sl,le,npr,amh,tsc,wa,pl5]
    column_lst = ["satisfaction_level", "last_evaluation", "number_project",
                  "average_monthly_hours", "time_spend_company", "Work_accident",
                  "promotion_last_5years"]
    for i in range(len(scaler_lst)):
        if not scaler_lst[i]:
            df[column_lst[i]]=MinMaxScaler().fit_transform(df[column_lst[i]].values.reshape(-1,1)).reshape(1,-1)[0]
        else:
            df[column_lst[i]]=StandardScaler().fit_transform(df[column_lst[i]].values.reshape(-1,1)).reshape(1,-1)[0]

    #针对离散值的处理
    scaler_lst=[slr,dp]
    column_lst=['salary','department']
    for i in range(len(scaler_lst)):
        if not scaler_lst[i]:
            if column_lst[i]=='salary':
                df[column_lst[i]]=[map_salary(s)for s in df['salary'].values]
            else:
                df[column_lst[i]]=LabelEncoder().fit_transform(df[column_lst[i]])
            df[column_lst[i]]=MinMaxScaler().fit_transform(df[column_lst[i]].values.reshape(-1,1)).reshape(1,-1)[0]
        else:
            df=pd.get_dummies(df,columns=[column_lst[i]])
    if lower_id:
        return PCA(n_components=ld_n).fit_transform(df.values),label
    return df,label

d=dict([('low',0),('medium',1),('high',2)])
def map_salary(s):
    return d.get(s,0)

#建模
def hr_modeling_nn(features,label):
    from sklearn.model_selection import train_test_split
    #sklearn中没有可以一次性将数据划分成验证集、训练集、测试集的包,所以需要进行两步划分
    f_v=features.values
    l_v=label.values
    X_tt,X_validation,Y_tt,Y_validation=train_test_split(f_v,l_v,test_size=0.2)
    X_train,X_test,Y_train,Y_test=train_test_split(X_tt,Y_tt,test_size=0.25)
    #print(len(X_train),len(X_test),len(X_validation))

    #分类
    from sklearn.metrics import accuracy_score,recall_score,f1_score
    from sklearn.neighbors import NearestNeighbors,KNeighborsClassifier
    from sklearn.naive_bayes import GaussianNB,BernoulliNB
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.svm import SVC
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.ensemble import AdaBoostClassifier
    from sklearn.linear_model import LogisticRegression
    from sklearn.ensemble import GradientBoostingClassifier

    models=[]
    models.append(('KNN',KNeighborsClassifier(n_neighbors=3)))
    models.append(('GaussianNB',GaussianNB()))
    models.append(('BernoulliNB',BernoulliNB()))
    models.append(('DecisionTreeGini',DecisionTreeClassifier()))
    models.append(('DecisionTreeEntropy',DecisionTreeClassifier(criterion='entropy')))
    models.append(('SVM:',SVC(C=1000)))
    models.append(('OriginalRandomForest',RandomForestClassifier()))
    models.append(('RandomForest',RandomForestClassifier(n_estimators=11,max_features=None)))
    models.append(('Adaboost',AdaBoostClassifier(n_estimators=100)))
    models.append(('LogisticRegression',LogisticRegression(C=1000,tol=1e-10,solver='sag',max_iter=10000)))
    models.append(('GBDT',GradientBoostingClassifier(max_depth=6,n_estimators=100)))


    for clf_name ,clf in models:
        clf.fit(X_train,Y_train)
        xy_list=[(X_train,Y_train),(X_validation,Y_validation),(X_test,Y_test)]
        for i in range(len(xy_list)):
            X_part=xy_list[i][0]
            Y_part=xy_list[i][1]
            Y_pred=clf.predict(X_part)
            print(i)
            print(clf_name,'-ACC',accuracy_score(Y_part,Y_pred))
            print(clf_name,'-REC:',recall_score(Y_part,Y_pred))
            print(clf_name,'-F1:',f1_score(Y_pred,Y_part))

#回归
def regr_t(features,label):
    print('X',features)
    print('Y',label)
    from sklearn.linear_model import LinearRegression,Ridge,Lasso
    regr=Ridge(alpha=1)
    regr.fit(features.values,label.values)
    Y_pred=regr.predict(features.values)
    print('Coef:',regr.coef_)
    from sklearn.metrics import mean_squared_error,mean_absolute_error,r2_score
    print('MSE:',mean_squared_error(label.values,Y_pred))
    print('MAE:',mean_absolute_error(label.values,Y_pred))
    print('R2:',r2_score(label.values,Y_pred))


def main():
    features,label=hr_preprocessing()
    hr_modeling_nn(features,label)
    regr_t(features[['number_project','average_monthly_hours']],features['last_evaluation'])
if __name__=='__main__':
    main()




 

spark python 数据处理 特征提取

博文 来自: xiuweixiansheng
没有更多推荐了,返回首页