精华内容
下载资源
问答
  • 常用的三种机器学习预测方法
    万次阅读
    2020-07-13 04:30:13


    以下代码统一为读入xlsx文件,其中第一列为因变量,其余列为自变量,每一行代表一个样本

    (matlab代码)

    线性回归

    %读取数据
    [X,TXT,RAW]=xlsread('train_element.xlsx');
    y=X(:,1);        %第一列为y值
    X(:,1)=[1];      %将第一列数值变为1
    [b,bint,r,rint,stats]=regress(y,X);
    b   %回归系数,第一个是常数项
    
    %测试
    [TX,TXT,RAW]=xlsread('test_element.xlsx');
    TY_num = size(TX,1);
    TY = [1:TY_num];
    TY(1,:) = b(1);
    
    for i = 1:30            %测试数据30行
        for j = 1:21       %每一行21个自变量
            TY(i) = TX(i,j+1) * b(j+1)+TY(i); % TX第一个是1,故j+1;b第一个是常数项系数,故j+1
          end  
    end
    hold on
    plot(TY)
    plot(TX(:,1))
    legend('预测值','真实值');
    TY
    
    

    BP网络

    在应用程序处打开Neural Net Fitting训练神经网络模型

    参见 (如何利用matlab做BP神经网络分析-利用matlab神经网络工具箱)[ https://blog.csdn.net/ljyljyok/article/details/81362465 ]

    function [ ] = BP_Forecast( X,TX )
    load BP_202054_14.mat         %导入网络模型
    X = X';			     	%转置
    Y=sim(net,X);         %使用训练好的BP网络模型预测
    

    SVM

    function [ ] = SVM_R( X,TX )
    %load svm_r			%若没有数据则读取模型
    
    %[X,TXT,RAW]=xlsread('train_element.xlsx');      %读取训练数据
    target = X(:,1);
    X(:,1) = [];
    train = X;
    
    %% 最优参数选择
    mse = 10^7;
    for log2c = -10:0.5:3
        for log2g = -10:0.5:3
            % -v 交叉验证参数:在训练的时候需要,测试的时候不需要,否则出错
            options = ['-v 3 -c ', num2str(2^log2c), ' -g ', num2str(2^log2g) , ' -s 3 -p 0.4 -t 3'];
            cv = svmtrain(target,train,options);
            if (cv < mse)
                mse = cv; bestc = 2^log2c; bestg = 2^log2g;
            end
        end
    end
    %%  训练
    options = ['-c ', num2str(2^bestc), ' -g ', num2str(2^bestg) , ' -s 3 -p 0.4 -n 0.1'];
    model = svmtrain(target,train,options)
    % model
    % 利用建立的模型看其在训练集合上的回归效果
    [predict_p,accuracy,dv] = svmpredict(target,train,model);
    figure
    plot(target,'o')
    hold on
    plot(predict_p,'.')
    
    test_target = TX(:,1); %这个随便给不影响预测的结果,但是会基于这个值计算预测准确率
    TX(:,1)=[];
    test_train = TX;
    global dv_t
    [predict_t,accuracy_t,dv_t] = svmpredict(test_target,test_train,model);
    hold on
    plot(predict_t,'*')
    legend('原始数据','回归数据','新数据预测');
    
    %直观对比
    %hold on
    %plot(TY)
    %plot(dv_t)
    %legend('原始数据','新数据预测');
    
    hold on
    plot(test_target)
    plot(dv_t)
    xlswrite('预测结果.xlsx',dv_t)
    legend('原始数据','新数据预测');
    
    
    更多相关内容
  • 机器学习大作业-预测天气.zip
  • Python机器学习预测算法

    千次阅读 2019-07-16 16:45:09
    a bytes-like object is required, not 'str'Python机器学习核心预测算法第2章 通过理解数据来了解问题2.1 解剖一个新问题2.1.1 属性和标签的不同类型决定模型的选择2.1.2 新数据集的注意事项2.2 分类问题:用声呐...

    Python机器学习核心预测算法

    关于本书的学习及上机实现的笔记。

    第2章 通过理解数据来了解问题

    2.1 解剖一个新问题

    note: 机器学习数据集通常对应列一个属性,行对应一个观察,但也有例外。例如,有些文本挖掘问题的数据矩阵就是另外的形式:列对应一个观察,行对应一个属性。
    属性(预测因子、特征、独立变量、输入)
    标签(结果、目标、依赖变量、响应)

    2.1.1 属性和标签的不同类型决定模型的选择

    a、数值变量;
    b、类别(因子、因素)变量
    例如惩罚回归算法只能处理数值变量,SVM、核方法、K最近邻也是同样。第4章将介绍将类别变量转换成数值变量的方法。
    当标签是数值的,就叫做回归问题。当标签是类别的,就叫做分类问题。如果分类结果只取2个值,就叫作二元分类问题。如果取多个值,就是多类别分类问题。
    可以吧一个回归问题变成二元分类问题。

    2.1.2 新数据集的注意事项

    需要检查的事项:
    1、行数、列数
    2、类别变了的数目、类别的取值范围
    3、缺失的值:当数据规模较大时,可以直接丢失;当数据规模小特别是生物数据且有多种属性时,需要找到方法把丢失的值填上(遗失值插补),或者使用能够处理丢失数据的算法。
    4、属性和标签的统计特性

    2.2 分类问题:用声呐发现未爆炸的水雷

    2.2.1 “岩石 vs. 水雷”数据集的物理特性

     运行时出现问题
      row = line.strip(' ').split(",")
      TypeError: a bytes-like object is required, not 'str'
      原因:Python3和Python2 在套接字返回值解码上有区别,需要decode(‘utf8’)
      具体解释参考链接:https://blog.csdn.net/NockinOnHeavensDoor/article/details/78765781
      https://www.fujieace.com/python/str-bytes.html 
    

    由程序 rockVmineSummaries.py 得到
    sonar 数据集规模
    另外一个重要的观察,如果数据集的列数远远大于行数,那么采用惩罚线性回归的方法则有很大可能获得最佳预测,反之亦然。
    由程序 rockVmineContents.py 可以确定哪些列是数值型的,哪些列是类别型的。分析结果:前60列是数值型,最后一列都是字符串。这些字符串值是标签。
    在这里插入图片描述确定每个属性的特征
    try…except…else…是Python中异常处理的方法,
    详见(https://www.runoob.com/python/python-exceptions.html)

    2.2.1 “岩石 vs. 水雷”数据集的统计特征

    由程序 rVMSummaryStats.py 得到该数据集的统计特征,

    展开全文
  • 使用机器学习预测天气(第一部分)

    万次阅读 多人点赞 2017-12-28 10:10:52
    概述  本章是使用机器学习预测天气系列教程的第一部分,使用Python和机器学习来构建模型,根据从Weather Underground收集的数据来预测天气温度。该教程将由三个不同的部分组成,涵盖的主题是: 数据收集和处理...

    概述

      本章是使用机器学习预测天气系列教程的第一部分,使用Python和机器学习来构建模型,根据从Weather Underground收集的数据来预测天气温度。该教程将由三个不同的部分组成,涵盖的主题是:

    • 数据收集和处理(本文)
    • 线性回归模型(第2章)
    • 神经网络模型(第3章)

      本教程中使用的数据将从Weather Underground的免费层API服务中收集。我将使用python的requests库来调用API,得到从2015年起Lincoln, Nebraska的天气数据。 一旦收集完成,数据将需要进行处理并汇总转成合适的格式,然后进行清理。
      第二篇文章将重点分析数据中的趋势,目标是选择合适的特性并使用python的statsmodels和scikit-learn库来构建线性回归模型。 我将讨论构建线性回归模型,必须进行必要的假设,并演示如何评估数据特征以构建一个健壮的模型。 并在最后完成模型的测试与验证。
      最后的文章将着重于使用神经网络。 我将比较构建神经网络模型和构建线性回归模型的过程,结果,准确性。

    Weather Underground介绍

      Weather Underground是一家收集和分发全球各种天气测量数据的公司。 该公司提供了大量的API,可用于商业和非商业用途。 在本文中,我将介绍如何使用非商业API获取每日天气数据。所以,如果你跟随者本教程操作的话,您需要注册他们的免费开发者帐户。 此帐户提供了一个API密钥,这个密钥限制,每分钟10个,每天500个API请求。
      获取历史数据的API如下:

    http://api.wunderground.com/api/API_KEY/history_YYYYMMDD/q/STATE/CITY.json  
    • API_KEY: 注册账户获取
    • YYYYMMDD: 你想要获取的天气数据的日期
    • STATE: 州名缩写
    • CITY: 你请求的城市名

    调用API

      本教程调用Weather Underground API获取历史数据时,用到如下的python库。

    名称描述来源
    datetime处理日期标准库
    time处理时间标准库
    collections使用该库的namedtuples来结构化数据标准库
    pandas处理数据第三方
    requestsHTTP请求处理库第三方
    matplotlib制图库第三方

      好,我们先导入这些库:

    from datetime import datetime, timedelta  
    import time  
    from collections import namedtuple  
    import pandas as pd  
    import requests  
    import matplotlib.pyplot as plt  

    接下里,定义常量来保存API_KEY和BASE_URL,注意,例子中的API_KEY不可用,你要自己注册获取。代码如下:

    API_KEY = '7052ad35e3c73564'  
    # 第一个大括号是API_KEY,第二个是日期
    BASE_URL = "http://api.wunderground.com/api/{}/history_{}/q/NE/Lincoln.json"  

    然后我们初始化一个变量,存储日期,然后定义一个list,指明要从API返回的内容里获取的数据。然后定义一个namedtuple类型的变量DailySummary来存储返回的数据。代码如下:

    target_date = datetime(2016, 5, 16)  
    features = ["date", "meantempm", "meandewptm", "meanpressurem", "maxhumidity", "minhumidity", "maxtempm",  
                "mintempm", "maxdewptm", "mindewptm", "maxpressurem", "minpressurem", "precipm"]
    DailySummary = namedtuple("DailySummary", features)  

    定义一个函数,调用API,获取指定target_date开始的days天的数据,代码如下:

    def extract_weather_data(url, api_key, target_date, days):  
        records = []
        for _ in range(days):
            request = BASE_URL.format(API_KEY, target_date.strftime('%Y%m%d'))
            response = requests.get(request)
            if response.status_code == 200:
                data = response.json()['history']['dailysummary'][0]
                records.append(DailySummary(
                    date=target_date,
                    meantempm=data['meantempm'],
                    meandewptm=data['meandewptm'],
                    meanpressurem=data['meanpressurem'],
                    maxhumidity=data['maxhumidity'],
                    minhumidity=data['minhumidity'],
                    maxtempm=data['maxtempm'],
                    mintempm=data['mintempm'],
                    maxdewptm=data['maxdewptm'],
                    mindewptm=data['mindewptm'],
                    maxpressurem=data['maxpressurem'],
                    minpressurem=data['minpressurem'],
                    precipm=data['precipm']))
            time.sleep(6)
            target_date += timedelta(days=1)
        return records

    首先,定义个list records,用来存放上述的DailySummary,使用for循环来遍历指定的所有日期。然后生成url,发起HTTP请求,获取返回的数据,使用返回的数据,初始化DailySummary,最后存放到records里。通过这个函数的出,就可以获取到指定日期开始的N天的历史天气数据,并返回。

    获取500天的天气数据

      由于API接口的限制,我们需要两天的时间才能获取到500天的数据。你也可以下载我的测试数据,来节约你的时间。

    records = extract_weather_data(BASE_URL, API_KEY, target_date, 500)  

    格式化数据为Pandas DataFrame格式

      我们使用DailySummary列表来初始化Pandas DataFrame。DataFrame数据类型是机器学习领域经常会用到的数据结构。

    df = pd.DataFrame(records, columns=features).set_index('date')

    特征提取

      机器学习是带有实验性质的,所以,你可能遇到一些矛盾的数据或者行为。因此,你需要在你用机器学习处理问题是,你需要对处理的问题领域有一定的了解,这样可以更好的提取数据特征。
      我将采用如下的数据字段,并且,使用过去三天的数据作为预测。

    • mean temperature
    • mean dewpoint
    • mean pressure
    • max humidity
    • min humidity
    • max dewpoint
    • min dewpoint
    • max pressure
    • min pressure
    • precipitation

    首先我需要在DataFrame里增加一些字段来保存新的数据字段,为了方便测试,我创建了一个tmp变量,存储10个数据,这些数据都有meantempm和meandewptm属性。代码如下:

    tmp = df[['meantempm', 'meandewptm']].head(10)  
    tmp  

    ![](http://7xpx6h.com1.z0.glb.clouddn.com/ae9fba86ccfb28be99c493c36a2b5f61
    )

    对于每一行的数据,我们分别获取他前一天、前两天、前三天对应的数据,存在本行,分别以属性_index来命名,代码如下:

    # 1 day prior
    N = 1
    
    # target measurement of mean temperature
    feature = 'meantempm'
    
    # total number of rows
    rows = tmp.shape[0]
    
    # a list representing Nth prior measurements of feature
    # notice that the front of the list needs to be padded with N
    # None values to maintain the constistent rows length for each N
    nth_prior_measurements = [None]*N + [tmp[feature][i-N] for i in range(N, rows)]
    
    # make a new column name of feature_N and add to DataFrame
    col_name = "{}_{}".format(feature, N)  
    tmp[col_name] = nth_prior_measurements  
    tmp  

    ![](http://7xpx6h.com1.z0.glb.clouddn.com/ea7572c6529c9b066e608f026b285adf
    )

    我们现在把上面的处理过程封装成一个函数,方便调用。

    def derive_nth_day_feature(df, feature, N):  
        rows = df.shape[0]
        nth_prior_measurements = [None]*N + [df[feature][i-N] for i in range(N, rows)]
        col_name = "{}_{}".format(feature, N)
        df[col_name] = nth_prior_measurements

    好,我们现在对所有的特征,都取过去三天的数据,放在本行。

    for feature in features:  
        if feature != 'date':
            for N in range(1, 4):
                derive_nth_day_feature(df, feature, N)

    处理完后,我们现在的所有数据特征为:

    df.columns  
    
    Index(['meantempm', 'meandewptm', 'meanpressurem', 'maxhumidity',  
           'minhumidity', 'maxtempm', 'mintempm', 'maxdewptm', 'mindewptm',
           'maxpressurem', 'minpressurem', 'precipm', 'meantempm_1', 'meantempm_2',
           'meantempm_3', 'meandewptm_1', 'meandewptm_2', 'meandewptm_3',
           'meanpressurem_1', 'meanpressurem_2', 'meanpressurem_3',
           'maxhumidity_1', 'maxhumidity_2', 'maxhumidity_3', 'minhumidity_1',
           'minhumidity_2', 'minhumidity_3', 'maxtempm_1', 'maxtempm_2',
           'maxtempm_3', 'mintempm_1', 'mintempm_2', 'mintempm_3', 'maxdewptm_1',
           'maxdewptm_2', 'maxdewptm_3', 'mindewptm_1', 'mindewptm_2',
           'mindewptm_3', 'maxpressurem_1', 'maxpressurem_2', 'maxpressurem_3',
           'minpressurem_1', 'minpressurem_2', 'minpressurem_3', 'precipm_1',
           'precipm_2', 'precipm_3'],
          dtype='object')

    数据清洗

      数据清洗时机器学习过程中最重要的一步,而且非常的耗时、费力。本教程中,我们会去掉不需要的样本、数据不完整的样本,查看数据的一致性等。
      首先去掉我不感兴趣的数据,来减少样本集。我们的目标是根据过去三天的天气数据预测天气温度,因此我们只保留min, max, mean三个字段的数据。

    # make list of original features without meantempm, mintempm, and maxtempm
    to_remove = [feature  
                 for feature in features 
                 if feature not in ['meantempm', 'mintempm', 'maxtempm']]
    
    # make a list of columns to keep
    to_keep = [col for col in df.columns if col not in to_remove]
    
    # select only the columns in to_keep and assign to df
    df = df[to_keep]  
    df.columns
    Index(['meantempm', 'maxtempm', 'mintempm', 'meantempm_1', 'meantempm_2',  
           'meantempm_3', 'meandewptm_1', 'meandewptm_2', 'meandewptm_3',
           'meanpressurem_1', 'meanpressurem_2', 'meanpressurem_3',
           'maxhumidity_1', 'maxhumidity_2', 'maxhumidity_3', 'minhumidity_1',
           'minhumidity_2', 'minhumidity_3', 'maxtempm_1', 'maxtempm_2',
           'maxtempm_3', 'mintempm_1', 'mintempm_2', 'mintempm_3', 'maxdewptm_1',
           'maxdewptm_2', 'maxdewptm_3', 'mindewptm_1', 'mindewptm_2',
           'mindewptm_3', 'maxpressurem_1', 'maxpressurem_2', 'maxpressurem_3',
           'minpressurem_1', 'minpressurem_2', 'minpressurem_3', 'precipm_1',
           'precipm_2', 'precipm_3'],
          dtype='object')

    为了更好的观察数据,我们使用Pandas的一些内置函数来查看数据信息,首先我们使用info()函数,这个函数会输出DataFrame里存放的数据信息。

    df.info()
    <class 'pandas.core.frame.DataFrame'>  
    DatetimeIndex: 1000 entries, 2015-01-01 to 2017-09-27  
    Data columns (total 39 columns):  
    meantempm          1000 non-null object  
    maxtempm           1000 non-null object  
    mintempm           1000 non-null object  
    meantempm_1        999 non-null object  
    meantempm_2        998 non-null object  
    meantempm_3        997 non-null object  
    meandewptm_1       999 non-null object  
    meandewptm_2       998 non-null object  
    meandewptm_3       997 non-null object  
    meanpressurem_1    999 non-null object  
    meanpressurem_2    998 non-null object  
    meanpressurem_3    997 non-null object  
    maxhumidity_1      999 non-null object  
    maxhumidity_2      998 non-null object  
    maxhumidity_3      997 non-null object  
    minhumidity_1      999 non-null object  
    minhumidity_2      998 non-null object  
    minhumidity_3      997 non-null object  
    maxtempm_1         999 non-null object  
    maxtempm_2         998 non-null object  
    maxtempm_3         997 non-null object  
    mintempm_1         999 non-null object  
    mintempm_2         998 non-null object  
    mintempm_3         997 non-null object  
    maxdewptm_1        999 non-null object  
    maxdewptm_2        998 non-null object  
    maxdewptm_3        997 non-null object  
    mindewptm_1        999 non-null object  
    mindewptm_2        998 non-null object  
    mindewptm_3        997 non-null object  
    maxpressurem_1     999 non-null object  
    maxpressurem_2     998 non-null object  
    maxpressurem_3     997 non-null object  
    minpressurem_1     999 non-null object  
    minpressurem_2     998 non-null object  
    minpressurem_3     997 non-null object  
    precipm_1          999 non-null object  
    precipm_2          998 non-null object  
    precipm_3          997 non-null object  
    dtypes: object(39)  
    memory usage: 312.5+ KB

    注意:每一行的数据类型都是object,我们需要把数据转成float。

    df = df.apply(pd.to_numeric, errors='coerce')  
    df.info()
    <class 'pandas.core.frame.DataFrame'>  
    DatetimeIndex: 1000 entries, 2015-01-01 to 2017-09-27  
    Data columns (total 39 columns):  
    meantempm          1000 non-null int64  
    maxtempm           1000 non-null int64  
    mintempm           1000 non-null int64  
    meantempm_1        999 non-null float64  
    meantempm_2        998 non-null float64  
    meantempm_3        997 non-null float64  
    meandewptm_1       999 non-null float64  
    meandewptm_2       998 non-null float64  
    meandewptm_3       997 non-null float64  
    meanpressurem_1    999 non-null float64  
    meanpressurem_2    998 non-null float64  
    meanpressurem_3    997 non-null float64  
    maxhumidity_1      999 non-null float64  
    maxhumidity_2      998 non-null float64  
    maxhumidity_3      997 non-null float64  
    minhumidity_1      999 non-null float64  
    minhumidity_2      998 non-null float64  
    minhumidity_3      997 non-null float64  
    maxtempm_1         999 non-null float64  
    maxtempm_2         998 non-null float64  
    maxtempm_3         997 non-null float64  
    mintempm_1         999 non-null float64  
    mintempm_2         998 non-null float64  
    mintempm_3         997 non-null float64  
    maxdewptm_1        999 non-null float64  
    maxdewptm_2        998 non-null float64  
    maxdewptm_3        997 non-null float64  
    mindewptm_1        999 non-null float64  
    mindewptm_2        998 non-null float64  
    mindewptm_3        997 non-null float64  
    maxpressurem_1     999 non-null float64  
    maxpressurem_2     998 non-null float64  
    maxpressurem_3     997 non-null float64  
    minpressurem_1     999 non-null float64  
    minpressurem_2     998 non-null float64  
    minpressurem_3     997 non-null float64  
    precipm_1          889 non-null float64  
    precipm_2          889 non-null float64  
    precipm_3          888 non-null float64  
    dtypes: float64(36), int64(3)  
    memory usage: 312.5 KB  

    现在得到我想要的数据了。接下来我们调用describe()函数,这个函数会返回一个DataFrame,这个返回值包含了总数、平均数、标准差、最小、25%、50%、75%、最大的数据信息。

      接下来,使用四分位的方法,去掉25%数据里特别小的和75%数据里特别大的数据。

    # Call describe on df and transpose it due to the large number of columns
    spread = df.describe().T
    
    # precalculate interquartile range for ease of use in next calculation
    IQR = spread['75%'] - spread['25%']
    
    # create an outliers column which is either 3 IQRs below the first quartile or
    # 3 IQRs above the third quartile
    spread['outliers'] = (spread['min']<(spread['25%']-(3*IQR)))|(spread['max'] > (spread['75%']+3*IQR))
    
    # just display the features containing extreme outliers
    spread.ix[spread.outliers,]  

    ![](http://7xpx6h.com1.z0.glb.clouddn.com/8ce8a308b12f48ca6ff13c861a94dcbd
    )
      评估异常值的潜在影响是任何分析项目的难点。 一方面,您需要关注引入虚假数据样本的可能性,这些样本将严重影响您的模型。 另一方面,异常值对于预测在特殊情况下出现的结果是非常有意义的。 我们将讨论每一个包含特征的异常值,看看我们是否能够得出合理的结论来处理它们。

      第一组特征看起来与最大湿度有关。 观察这些数据,我可以看出,这个特征类别的异常值是非常低的最小值。这数据看起来没价值,我想我想仔细看看它,最好是以图形方式。 要做到这一点,我会使用直方图。

    %matplotlib inline
    plt.rcParams['figure.figsize'] = [14, 8]  
    df.maxhumidity_1.hist()  
    plt.title('Distribution of maxhumidity_1')  
    plt.xlabel('maxhumidity_1')  
    plt.show()

    ![](http://7xpx6h.com1.z0.glb.clouddn.com/dfe783975866aead6b8642856d3f4699
    )
    查看maxhumidity字段的直方图,数据表现出相当多的负偏移。 在选择预测模型和评估最大湿度影响的强度时,我会牢记这一点。 许多基本的统计方法都假定数据是正态分布的。 现在我们暂时不管它,但是记住这个异常特性。

      接下来我们看另外一个字段的直方图

    df.minpressurem_1.hist()  
    plt.title('Distribution of minpressurem_1')  
    plt.xlabel('minpressurem_1')  
    plt.show() 

    ![](http://7xpx6h.com1.z0.glb.clouddn.com/90ffb866175c0b4f9adaf6660bbdabc3
    )

      要解决的最后一个数据质量问题是缺失值。 由于我构建DataFrame的时候,缺少的值由NaN表示。 您可能会记得,我通过推导代表前三天测量结果的特征,有意引入了收集数据前三天的缺失值。 直到第三天我们才能开始推导出这些特征,所以很明显我会想把这些头三天从数据集中排除出去。
    再回头再看一下上面info()函数输出的信息,可以看到包含NaN值的数据特征非常的少,除了我提到的几个字段,基本就没有了。因为机器学习需要样本字段数据的完整性,因为如果我们因为降水量那个字段为空,就去掉样本,那么会造成大量的样本不可用,对于这种情况,我们可以给为空的降水量字段的样本填入一个值。根据经验和尽量减少由于填入的值对模型的影响,我决定给为空的降水量字段填入值0。

    # iterate over the precip columns
    for precip_col in ['precipm_1', 'precipm_2', 'precipm_3']:  
        # create a boolean array of values representing nans
        missing_vals = pd.isnull(df[precip_col])
        df[precip_col][missing_vals] = 0

    填入值后,我们就可以删掉字段值为空的样本了,只用调用dropna()函数。

    df = df.dropna()  

    总结

      这篇文章主要介绍了数据的收集、处理、清洗的流程,本篇文章处理完的处理,将用于下篇文章的模型训练。
      对你来说,这篇文章可能很枯燥,没啥干货,但好的样本数据,才能训练处好的模型,因此,样本数据的收集和处理能力,直接影响你后面的机器学习的效果。

    英文原文

    转自我的博客,捕蛇者说

    展开全文
  • 使用机器学习预测天气(第二部分)

    万次阅读 多人点赞 2018-01-03 11:24:10
    概述  这篇文章我们接着前一篇文章,使用Weather Underground网站获取到的数据,来继续探讨用机器学习的方法预测内布拉斯加州林肯市的天气   上一篇文章我们已经探讨了如何收集、整理、清洗数据。这篇文章我们...

    概述

      这篇文章我们接着前一篇文章,使用Weather Underground网站获取到的数据,来继续探讨用机器学习的方法预测内布拉斯加州林肯市的天气
      上一篇文章我们已经探讨了如何收集、整理、清洗数据。这篇文章我们将使用上一篇文章处理好的数据,建立线性回归模型来预测天气。为了建立线性回归模型,我要用到python里非常重要的两个机器学习相关的库:Scikit-Learn和StatsModels 。
      第三篇文章我们将使用google TensorFlow来建立神经网络模型,并把预测的结果和线性回归模型的结果做比较。
      这篇文章中会有很多数学概念和名词,如果你理解起来比较费劲,建议你先google相关数据概念,有个基础的了解。

    获取数据

      在这个Github仓库,有个名为Underground API.ipynb的 Jupyter Notebook文件,这个文件记录了我们这篇文章和下一篇文章要用到的数据的获取、整理步骤。你还会发现一个名为end-part1_df.pkl的文件,如果你自己没有处理好数据,可以直接用这个文件,然后使用下面的代码来把数据转成Pandas DataFrame类型。

    import pickle  
    with open('end-part1_df.pkl', 'rb') as fp:  
        df = pickle.load(fp)

    如果运行上面的代码遇到错误:No module named 'pandas.indexes',那么说明你用的pandas库的版本和我的(v0.18.1)不一致,为了避免这样的错误发生,我还准备了个csv文件,你可以从上述的Github仓库获取,然后使用下面的代码读入数据。

    import pandas as pd  
    df = pd.read_csv('end-part2_df.csv').set_index('date')

    线性回归算法

      线性回归模型的目标是使用一系列线性相关的数据和数字技术来根据预测因素X(自变量)来预测可能的结果Y(因变量),最终建立一个模型(数学公式)来预测给定任意的预测因素X来计算对应的结果Y。
      线性回归的一般公式为:

    ŷ = β0 + β1 * x1 + β2 * x2 + ... + β(p-n) x(p-n) + Ε

    关于公式的详细解释,查看百度百科-线性回归模型

    为模型选取特征数据

      线性回归技术要求的关键假设是,因变量和每个自变量之间有一个线性关系。针对我们的数据,就是温度和其他变量,然后计算Pearson相关系数。Pearson相关系数(r)是输出范围为-1到1的值的等长阵列之间的线性相关量的量度。范围从0到1的相关值表示越来越强的正相关性。 这意味着当一个数据序列中的值与另一个序列中的值同时增加时,两个数据序列呈正相关,并且由于它们两者的上升幅度越来越相等,Pearson相关值将接近1。从0到-1的相关值被认为是相反或负相关的,因为当一个系列的值增加相反系列减小的相应值时,但是当系列之间的幅度变化相等(相反的方向)时, 相关值将接近-1。 紧密地跨越零的Pearson相关值暗示着具有弱的线性关系,随着值趋近于零而变弱。
      关于相关系数的强度界定,统计学家和统计书籍中的观点各不相同。 但是,我发现一个普遍接受的关联强度分类集合如下:

    为了评估这个数据中的相关性,我将调用Pandas DataFrame对象的corr()方法。通过corr()函数的调用,我可以选择我感兴趣的数据(meantempm),然后再对返回的结果(Pandas Series object)调用sort_values()函数,这将输出从最负相关到最正相关的相关值。

    df.corr()[['meantempm']].sort_values('meantempm')  



      在选择包括在这个线性回归模型中的特征时,我想在包含具有中等或较低相关系数的变量时略微宽容一些。 所以我将删除相关值的绝对值小于0.6的特征。 此外,由于“mintempm”和“maxtempm”变量与预测变量“meantempm”同一天,我也将删除这些(即,如果我已经知道最高和最低温度,那么我已经有了我的答案)。有了这些信息,我现在可以创建一个新的DataFrame,它只包含我感兴趣的变量。

    predictors = ['meantempm_1',  'meantempm_2',  'meantempm_3',  
                  'mintempm_1',   'mintempm_2',   'mintempm_3',
                  'meandewptm_1', 'meandewptm_2', 'meandewptm_3',
                  'maxdewptm_1',  'maxdewptm_2',  'maxdewptm_3',
                  'mindewptm_1',  'mindewptm_2',  'mindewptm_3',
                  'maxtempm_1',   'maxtempm_2',   'maxtempm_3']
    df2 = df[['meantempm'] + predictors]  

    可视化展示数据关系

    因为大多数人,包括我自己在内,都更习惯于用视觉来评估和验证模式,所以我将绘制每个选定的预测因子来证明数据的线性关系。 要做到这一点,我将利用matplotlib的pyplot模块。
    对于这个图,我希望将因变量“meantempm”作为沿所有18个预测变量图的一致y轴。 一种方法是创建一个的网格。 Pandas的确有一个有用的绘图函数叫做scatter_plot(),但是通常只有当大约只有5个变量时才使用它,因为它将绘图变成一个N×N的矩阵(在我们的例子中是18×18) 变得难以看到数据中的细节。 相反,我将创建一个六行三列的网格结构,以避免牺牲图表的清晰度。

    import matplotlib  
    import matplotlib.pyplot as plt  
    import numpy as np
    # manually set the parameters of the figure to and appropriate size
    plt.rcParams['figure.figsize'] = [16, 22]
    # call subplots specifying the grid structure we desire and that 
    # the y axes should be shared
    fig, axes = plt.subplots(nrows=6, ncols=3, sharey=True)
    
    # Since it would be nice to loop through the features in to build this plot
    # let us rearrange our data into a 2D array of 6 rows and 3 columns
    arr = np.array(predictors).reshape(6, 3)
    
    # use enumerate to loop over the arr 2D array of rows and columns
    # and create scatter plots of each meantempm vs each feature
    for row, col_arr in enumerate(arr):  
        for col, feature in enumerate(col_arr):
            axes[row, col].scatter(df2[feature], df2['meantempm'])
            if col == 0:
                axes[row, col].set(xlabel=feature, ylabel='meantempm')
            else:
                axes[row, col].set(xlabel=feature)
    plt.show()



    从上面的图中可以看出,所有其余的预测变量与响应变量(“meantempm”)显示出良好的线性关系。 此外,值得注意的是,这些关系都是均匀随机分布的。 我的意思是,在没有任何扇形或圆锥形状的情况下,数值的扩散似乎有相对相等的变化。 使用普通最小二乘算法的线性回归的另一个重要假设是沿点的均匀随机分布。

    使用逐步回归建立一个健壮的模型

      一个强大的线性回归模型必须选取有意义的、重要的统计指标的指标作为预测指标。 为了选择统计上显着的特征,我将使用Python statsmodels库。然而,在使用statsmodels库之前,我想先说明采取这种方法的一些理论意义和目的。
      在分析项目中使用统计方法(如线性回归)的一个关键方面是建立和测试假设检验,以验证所研究数据假设的重要性。 有很多假设检验已经被开发来测试线性回归模型对各种假设的稳健性。 一个这样的假设检验是评估每个包含的预测变量的显着性。
      βj参数意义的假设检验的正式定义如下:

    • H0:βj= 0,零假设表明预测变量对结果变量的值没有影响
    • Ha:βj≠0,可选假设是预测变量对结果变量的值有显着影响

    通过使用概率测试来评估每个βj在选定阈值Α处超过简单随机机会的显着性的可能性,我们可以在选择更严格数据,以保证模型的鲁棒性。
      然而在许多数据集中,数据间的相互影响会导致一些简单的假设检验不符合预期。 为了在线性回归模型中测试相互作用对任何一个变量的影响,通常应用被称为逐步回归的技术。 通过增加或者删除变量来评估每个变量的变化,对产生的模型的影响。在本文中,我将使用一种称为“后向消除”的技术,从一个包含我感兴趣数据的模型开始。

      后向消除工作流程如下:

    • 选择一个重要的阶段A,能够确定一个数据是否能通过建设检验。
    • 把预测数据填入模型
    • 评估βj系数的p值和p值最大的p值,如果p值>Α进行到第4步,如果不是,则得到最终模型
    • 删除步骤3中确定的预测变量
    • 再次安装模型,但这次没有删除变量,然后循环回到第3步

      下面我们使用statsmodels按照上面的步骤,来构建我们的模型。

    # import the relevant module
    import statsmodels.api as sm
    
    # separate our my predictor variables (X) from my outcome variable y
    X = df2[predictors]  
    y = df2['meantempm']
    
    # Add a constant to the predictor variable set to represent the Bo intercept
    X = sm.add_constant(X)  
    X.ix[:5, :5]  

    # (1) select a significance value
    alpha = 0.05
    
    # (2) Fit the model
    model = sm.OLS(y, X).fit()
    
    # (3) evaluate the coefficients' p-values
    model.summary()  

    调用summary()函数输出的数据如下:



    • 好的,我认识到,对summary()的调用只是把大量的信息打印在屏幕上。在这篇文章中,我们只关注2-3个值:

    • P>| T | - 这是我上面提到的p值,我将用它来评估假设检验。 这是我们要用来确定是否消除这个逐步反向消除技术的变量的价值。
      R平方 - 一个衡量标准,我们的模型可以解释结果的整体变化的多少

    • ADJ。 R平方 - 与R平方相同,但是,对于多元线性回归,根据包含的变量数来解释过度拟合水平,该值会受到惩罚。

    这并不是说在这个输出中的其他价值是没有价值的,恰恰相反,它们涉及到线性回归的更深奥的特质,我们现在根本没有时间考虑到。对于他们的完整解释,我会推迟到高级回归教科书,如Kutner的应用线性回归模型,第五版。 以及statsmodels文件。

    # (3) cont. - Identify the predictor with the greatest p-value and assess if its > our selected alpha.
    #             based off the table it is clear that meandewptm_3 has the greatest p-value and that it is
    #             greater than our alpha of 0.05
    
    # (4) - Use pandas drop function to remove this column from X
    X = X.drop('meandewptm_3', axis=1)
    
    # (5) Fit the model 
    model = sm.OLS(y, X).fit()
    
    model.summary()  



    关于您的阅读时间,为了保持文章的合理长度,我将省略构建每个新模型所需的剩余消除周期,评估p值并删除最不重要的值。 相反,我会跳到最后一个周期,并为您提供最终的模型。 毕竟,这里的主要目标是描述过程和背后的推理。下面你会发现我应用反向消除技术后收敛的最终模型的输出。 您可以从输出中看到,所有其余的预测变量的p值显着低于我们的0.05。 另外值得注意的是最终输出中的R平方值。 这里需要注意两点:(1)R平方和Adj。 R平方值是相等的,这表明我们的模型被过度拟合的风险最小,(2)0.894的值被解释为使得我们的最终模型解释了结果变量中观察到的变化的大约90% ,“meantempm”。

    model = sm.OLS(y, X).fit()  
    model.summary() 


    使用SciKit-Learn的线性回归模块预测天气

      现在我们已经完成了选择具有统计意义的预测指标(特征)的步骤,我们可以使用SciKit-Learn创建预测模型并测试其预测平均温度的能力。 SciKit-Learn是一个非常完善的机器学习库,在工业界和学术界广泛使用。关于SciKit-Learn的一件事非常令人印象深刻的是,它在许多数值技术和算法中保持了一个非常一致的“适应”,“预测”和“测试”API,使得使用它非常简单。除了这个一致的API设计,SciKit-Learn还提供了一些有用的工具来处理许多机器学习项目中常见的数据。

      我们将通过使用SciKit-Learn从sklearn.model_selection模块中导入train_test_split()函数来开始将我们的数据集分割成测试和训练集。我将把训练和测试数据集分成80%的训练和20%的测试,并且分配一个12的random_state,以确保你将得到和我一样的随机选择数据。这个random_state参数对结果的可重复性非常有用。

    from sklearn.model_selection import train_test_split  
    # first remove the const column because unlike statsmodels, SciKit-Learn will add that in for us
    X = X.drop('const', axis=1)
    
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=12) 

    接下来的操作是使用训练数据集建立回归模型。 为此,我将从sklearn.linear_model模块导入并使用LinearRegression类。 正如前面提到的,scikit-learn分数通过通用的fit()和predict()这两个函数计算得到。

    from sklearn.linear_model import LinearRegression  
    # instantiate the regressor class
    regressor = LinearRegression()
    
    # fit the build the model by fitting the regressor to the training data
    regressor.fit(X_train, y_train)
    
    # make a prediction set using the test set
    prediction = regressor.predict(X_test)
    
    # Evaluate the prediction accuracy of the model
    from sklearn.metrics import mean_absolute_error, median_absolute_error  
    print("The Explained Variance: %.2f" % regressor.score(X_test, y_test))  
    print("The Mean Absolute Error: %.2f degrees celsius" % mean_absolute_error(y_test, prediction))  
    print("The Median Absolute Error: %.2f degrees celsius" % median_absolute_error(y_test, prediction))
    
    The Explained Variance: 0.90  
    The Mean Absolute Error: 2.69 degrees celsius  
    The Median Absolute Error: 2.17 degrees celsius  

    正如你可以在上面几行代码中看到的那样,使用scikit-learn构建线性回归预测模型非常简单。

    为了获得关于模型有效性的解释性理解,我使用了回归模型的score()函数来确定该模型能够解释在结果变量(平均温度)中观察到的约90%的方差。 此外,我使用sklearn.metrics模块的mean_absolute_error()和median_absolute_error()来确定平均预测值约为3摄氏度关闭,一半时间关闭约2摄氏度。

    总结

    在本文中,我演示了基于上一篇文章收集的数据如何使用线性回归机器学习算法来预测未来的平均天气温度。在本文中,我演示了如何使用线性回归机器学习算法来预测未来的平均天气温度,基于上一篇文章收集的数据。 我演示了如何使用statsmodels库来根据合理的统计方法选择具有统计显着性的预测指标。 然后,我利用这些信息来拟合基于Scikit-Learn的LinearRegression类的训练子集的预测模型。 然后使用这个拟合的模型,我可以根据测试子集的输入预测预期值,并评估预测的准确性。

    相关文章

    转自我的博客:捕蛇者说

    展开全文
  • 这是使用机器学习预测平均气温系列文章的最后一篇文章了,作为最后一篇文章,我将使用google的开源机器学习框架tensorflow来构建一个神经网络回归器。
  • 使用机器学习预测股价

    千次阅读 2021-05-20 23:29:32
    股票价格预测有助于确定未来几天或几周内股票的走势,或者至少显示趋势。股票价格取决于多种因素,例如: 基本因素:收入,利润,市场份额,业务的潜在增长前景 外部因素:大流行病,例如新冠,外汇汇率,石油价格,...
  • 机器学习项目实战系列 机器学习预测股价 目录 机器学习项目实战系列 机器学习预测股价 一、概述 二、分析数据 1.导入 2.数据导入 3.分析股票尾市数据 4.构建模型 5.测试模型 6.展示预测结果 一、概述 ...
  • 采用 Python 机器学习预测足球比赛结果

    万次阅读 多人点赞 2019-04-23 23:30:08
    足球是世界上最火爆的运动之一,如何运用机器学习预测足球比赛结果,是每一个足球爱好者所向往的! 本场 Chat 适合有 Python 基础的机器学习初学者,我们带你一起熟悉机器学习的开发流程,帮你快速建立起自己的...
  • 【临床预测模型】----10步建立预测模型 好多小伙伴在首次构建一个临床预测模型构建时,一头雾水找不着北???? 为了解决这一问题,小编思索良久,决定彻夜归纳,5min快速概括,告诉各位头大的小朋友,每一步应该怎么做...
  • 机器学习预测指标简介 在我们学习数据挖掘的过程中,在刚开始学习的时候认为只要预测正确的准确率越高的模型一定是越好的,但是当我们往后学习的时候,接触到了一些新的问题的时候,我们会发现最开始衡量预测正确的...
  • 本文的重点是比较机器学习方法和特征工程技术在多大程度上提高了预测性能,采用了三种不同的机器学习方法。它们是线性回归、决策树和朴素贝叶斯分类。特征工程是对数据集特征进行修改和选择的过程,用于改进这些学习...
  • 来源:AISHWARYA SINGH, 2018年10月25日翻译:赵雪尧校对:车前子本文约8000字,建议阅读15+分钟。本文介绍了如何运用深度学习预测股票市场。简介...
  • 利用机器学习进行房价预测

    千次阅读 2022-03-27 23:00:00
    机器学习语料库 垂直领域的服务(二手车估值) 聚合服务(去哪儿网,美团) 新闻推荐(今日头条) 预测和判断(医疗领域) 所以爬虫能做的功能非常多,也就造就了爬虫的需求也是越来越旺盛,但是很多有过后端开发的
  • LGB机器学习预测数字货币涨跌

    千次阅读 2021-11-20 23:49:38
    1. 模型选择 LGB全名LigthGBM是boosting集合模型中的新进成员,它和xgboost一样是对GBDT的高效实现,很多方面会比xgboost表现的更为优秀。... LightGBM模型简单预测股票涨跌情况 LightGBM(lgb)介绍
  • 夫血肉之身,尚然有数;义理之身,岂不能格天。...目录前言随机森林算法搭建股票预测模型预测下一天的股票涨跌参数调优绘制预测与实际涨跌对比图 前言 前面9篇博文对量化交易的各种图形绘制以及计算公式已经.
  • Elastic:验证机器学习预测的准确性

    千次阅读 2021-01-09 19:15:24
    关于机器学习预测数据的准确性如何,我们今天讲使用一个例子来进行展示。如果你想了解更多关于 Elastic Stack 的机器学习方面的知识,请阅读我之前的文章 “Elastic:机器学习的原理及实践 - single metric job”。
  • 机器学习——成绩预测

    千次阅读 2021-07-10 20:48:00
    某学校为提高教学和思想工作水平,希望能够对学生的学习成绩进行预测,从而提前发现学生的学业问题。为了实现这一目标,该学校整理了 20 年的成绩数据的五门课程的成绩,其中第一学期课程两门,分别为 A 和 B ;第二...
  • (一)作业要求 advertising.csv文件是某商品的广告推广费用(单位为元)和销售额数据(单位为千元),其中每行代表每一周的广告推广费用(包含微信、...对于这个实验,是机器学习中最常见的一类回归问题,通过已有的
  • 机器学习预测世界杯:巴西夺冠

    千次阅读 2018-06-11 14:38:29
    新智元报道 来源:Medium,Github,KDnuggets等【导读】2018年世界杯开幕在即,谁会赢得最后的冠军?机器学习预测是巴西,而统计方法则认为德国会赢...
  • 下面是该类的一些题目: 题目 基于CT影像组学和深度学习的进展期胃癌预后预测研究 ...基于CT影像组学精准预测非小细胞肺癌术后预后的研究 ...基于机器学习的IgA肾病患者预后预测模型建立及免疫抑制剂治疗
  • 机器学习分类和预测任务

    千次阅读 2021-12-15 11:55:51
    机器学习分类和预测任务
  • 全文共5549字,预计学习时长11分钟 正如人们所想象的一样,在华尔街工作充满机遇与挑战。大家都西装革履、脸色阴沉、手持香烟吞云吐雾。在世界金融中心的喧嚣里,每个人的实际目标都很简单。不过是冒着将事物过于...
  • 机器学习之乳腺癌预测

    千次阅读 2021-11-13 14:47:36
    机器学习之乳腺癌预测(一).导入数据1.问题背景2.问题分析3. 认识数据集4.导入数据A.数据概述查看数据维度数据统计描述数据分布情况B.缺失处理 (一).导入数据 1.问题背景 乳腺癌是女性最常见的恶性肿瘤,占美国女性...
  • 月份 投标人数 额度 中标率 最低成交价 成交均价 成交时间 1月 168614 12832 7.6% 89500 89565 11:29:58 2月 163571 8998 5.5% 89400 ......
  • 大数据文摘作品作者:Susan...我们在UCL机器学习数据库里一个糖尿病数据集,希望可以通过这一数据集,了解如何利用机器学习来帮助我们预测糖尿病,让我们开始吧!数据集github链接:https://github.com/susanli2016/Mac
  • 通俗的解释机器学习预测原理

    千次阅读 2020-01-04 16:50:25
    通俗易懂的机器学习预测原理解释,没有任何数学公式
  • 基于机器学习的天气预测

    千次阅读 2022-03-04 18:16:01
    基于机器学习的天气预测 文章目录基于机器学习的天气预测1、数据导入与预处理空值的处理将上一行数据填充到空值处异常值的处理,画图来判断是否存在异常值对目标值进行处理2、样本比例调整调整样本比例将天气情况...
  • 机器学习入门项目,kaggle里的项目房价预测,适合初学者学习数据分析及机器学习算法,入门Kaggle.

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 314,758
精华内容 125,903
关键字:

机器学习预测