美文网首页
用SVM预测火灾森林毁坏面积

用SVM预测火灾森林毁坏面积

作者: apricoter | 来源:发表于2019-02-25 21:41 被阅读137次
    # 导入第三方模块
    from sklearn import svm
    import pandas as pd
    from sklearn import model_selection
    from sklearn import metrics
    # 读取外部数据
    forestfires = pd.read_csv(r'F:\forestfires.csv')
    # 数据前5行
    forestfires.head()
    

    X,Y为坐标位置
    mon和day均为字符型,做数值型转换,且day为无关变量

    # 删除day变量
    forestfires.drop('day',axis = 1, inplace = True)
    # 将月份作数值化处理
    forestfires.month = pd.factorize(forestfires.month)[0]
    # 预览数据前5行
    forestfires.head()
    

    因变量area为数值型变量,而对连续型的因变量需要做分布的探索性分析,如果数据呈现严重偏态,会产生很差效果

    # 导入第三方模块
    import seaborn as sns
    import matplotlib.pyplot as plt
    from scipy.stats import norm
    # 绘制森林烧毁面积的直方图
    sns.distplot(forestfires.area, bins = 50, kde = True, fit = norm, hist_kws = {'color':'steelblue'}, 
                 kde_kws = {'color':'red', 'label':'Kernel Density'}, 
                 fit_kws = {'color':'black','label':'Nomal', 'linestyle':'--'})
    # 显示图例
    plt.legend()
    # 显示图形
    plt.show()
    

    严重右偏,作对数处理

    # 导入第三方模块
    from sklearn import preprocessing
    import numpy as np
    from sklearn import neighbors
    # 对area变量作对数变换
    y = np.log1p(forestfires.area)
    # 将X变量作标准化处理
    predictors = forestfires.columns[:-1]
    X = preprocessing.scale(forestfires[predictors])
    X
    

    拆分数据,先用默认参数构建模型,后续调参

    # 将数据拆分为训练集和测试集
    X_train,X_test,y_train,y_test = model_selection.train_test_split(X, y, test_size = 0.25, random_state = 1234)
    # 构建默认参数的SVM回归模型
    svr = svm.SVR()
    # 模型在训练数据集上的拟合
    svr.fit(X_train,y_train)
    # 模型在测试上的预测
    pred_svr = svr.predict(X_test)
    # 计算模型的MSE
    metrics.mean_squared_error(y_test,pred_svr)
    
    # 使用网格搜索法,选择SVM回归中的最佳C值、epsilon值和gamma值
    epsilon = np.arange(0.1,1.5,0.2)
    C= np.arange(100,1000,200)
    gamma = np.arange(0.001,0.01,0.002)
    parameters = {'epsilon':epsilon,'C':C,'gamma':gamma}
    grid_svr = model_selection.GridSearchCV(estimator = svm.SVR(),param_grid =parameters,
                                            scoring='neg_mean_squared_error',cv=5,verbose =1, n_jobs=2)
    # 模型在训练数据集上的拟合
    grid_svr.fit(X_train,y_train)
    # 返回交叉验证后的最佳参数值
    print(grid_svr.best_params_, grid_svr.best_score_)
    
    # 模型在测试集上的预测
    pred_grid_svr = grid_svr.predict(X_test)
    # 计算模型在测试集上的MSE值
    metrics.mean_squared_error(y_test,pred_grid_svr)
    

    经过5重交叉验证,以及调参之后,MSE减小,预测效果较好。说明参数优化很重要。

    总之,核函数选择高斯核函数时模型拟合效果往往更好,因为高斯核是一种指数函数,它的泰勒展开式可以是无穷维的,即相当于把原始样本点映射到高维空间中。

    惩罚系数往往在0.0001-10000,值越大,惩罚力度越大,模型越有可能产生过拟合;高斯核函数中的Y值越大,对应的支持向量则越少,反之支持向量越多,模型越复杂,越可能过拟合。

    相关文章

      网友评论

          本文标题:用SVM预测火灾森林毁坏面积

          本文链接:https://www.haomeiwen.com/subject/sisnyqtx.html