Hướng dẫn can we plot multiple linear regression in python? - chúng ta có thể vẽ nhiều hồi quy tuyến tính trong python không?

Danh mục> Học máy

Ngày 18 tháng 11 năm 2019

Có nhiều phương pháp học máy nâng cao với độ chính xác dự đoán mạnh mẽ. Mặc dù các mô hình phức tạp có thể vượt trội so với các mô hình đơn giản trong việc dự đoán biến phản hồi, các mô hình đơn giản tốt hơn để hiểu được tác động và tầm quan trọng của từng tính năng trên một biến phản hồi. Khi nhiệm vụ trong tay có thể được mô tả bằng mô hình tuyến tính, hồi quy tuyến tính chiến thắng trên tất cả các phương pháp học máy khác trong giải thích tính năng do tính đơn giản của nó.

Bài đăng này cố gắng giúp bạn hiểu về hồi quy tuyến tính trong không gian tính năng đa chiều, đánh giá độ chính xác của mô hình và cung cấp đoạn mã cho hồi quy tuyến tính nhiều trong Python.

0. Mô tả dữ liệu mẫu

Chúng tôi sẽ sử dụng một dữ liệu mẫu trong suốt bài đăng này. Dữ liệu mẫu có liên quan đến ngành công nghiệp dầu khí. Nó có nguồn gốc từ Tiến sĩ Michael Pyrcz, Giáo sư Kỹ thuật Dầu khí tại Đại học Texas ở Austin. Dữ liệu gốc có thể được tìm thấy từ repo GitHub của anh ấy. Bạn cũng có thể sử dụng tải xuống trực tiếp hoặc truy cập trực tiếp bằng URL Pandas như bên dưới:

In [1]:

import pandas as pd

file = '//aegis4048.github.io/downloads/notebooks/sample_data/unconv_MV_v5.csv'
df = pd.read_csv[file]

Out[2]:

TốtPoruốnAiGiònTOCVrProd
0 1 12.08 2.92 2.80 81.40 1.16 2.31 4165.196191
1 2 12.38 3.53 3.22 46.17 0.89 1.88 3561.146205
2 3 14.02 2.59 4.01 72.80 0.89 2.72 4284.348574
3 4 17.67 6.75 2.63 39.81 1.08 1.88 5098.680869
4 5 17.52 4.57 3.18 10.94 1.51 1.90 3406.132832
5 6 14.53 4.81 2.69 53.60 0.94 1.67 4395.763259
6 7 13.49 3.60 2.93 63.71 0.80 1.85 4104.400989
7 8 11.58 3.03 3.25 53.00 0.69 1.93 3496.742701
8 9 12.52 2.72 2.43 65.77 0.95 1.98 4025.851153
9 10 13.25 3.94 3.71 66.20 1.14 2.65 4285.026122

Mô tả các tiêu đề

  1. Vâng: Chỉ số tốt
  2. POR: Độ xốp trung bình tốt [%]
  3. Perm: tính thấm [MD]
  4. AI: trở kháng accoustic [kg/m2s*10^6]
  5. Brittle: Tỷ lệ chống nổ [%]
  6. TOC: Tổng lượng carbon hữu cơ [%]
  7. VR: Độ phản xạ vitrinite [%]
  8. Prod: Sản xuất khí mỗi ngày [MCFD] - Biến phản hồiResponse Variable

Chúng tôi có sáu tính năng [POR, PERM, AI, giòn, TOC, VR] để dự đoán biến phản hồi [prod]. Dựa trên mức độ quan trọng của tính năng hoán vị được hiển thị trong Hình [1], POR là tính năng quan trọng nhất và giòn là tính năng quan trọng thứ hai.

Xếp hạng tính năng hoán vị nằm ngoài phạm vi của bài đăng này và sẽ không được thảo luận chi tiết. Tính năng đạt được đạt được với thư viện RFPIMP Python. Để biết thêm thông tin về Xếp hạng tính năng hoán vị, hãy tham khảo bài viết này: Hãy coi chừng Hiệu quả rừng ngẫu nhiên mặc định

Hình 1: Xếp hạng tính năng hoán vị

Mã nguồn cho Hình [1]

            
                import rfpimp
                import pandas as pd
                import numpy as np
                from sklearn.ensemble import RandomForestRegressor
                from sklearn.model_selection import train_test_split

                ######################################## Data preparation #########################################

                file = '//aegis4048.github.io/downloads/notebooks/sample_data/unconv_MV_v5.csv'
                df = pd.read_csv[file]
                features = ['Por', 'Perm', 'AI', 'Brittle', 'TOC', 'VR', 'Prod']

                ######################################## Train/test split #########################################

                df_train, df_test = train_test_split[df, test_size=0.20]
                df_train = df_train[features]
                df_test = df_test[features]

                X_train, y_train = df_train.drop['Prod',axis=1], df_train['Prod']
                X_test, y_test = df_test.drop['Prod',axis=1], df_test['Prod']

                ################################################ Train #############################################

                rf = RandomForestRegressor[n_estimators=100, n_jobs=-1]
                rf.fit[X_train, y_train]

                ############################### Permutation feature importance #####################################

                imp = rfpimp.importances[rf, X_test, y_test]

                ############################################## Plot ################################################

                fig, ax = plt.subplots[figsize=[6, 3]]

                ax.barh[imp.index, imp['Importance'], height=0.8, facecolor='grey', alpha=0.8, edgecolor='k']
                ax.set_xlabel['Importance score']
                ax.set_title['Permutation feature importance']
                ax.text[0.8, 0.15, 'aegis4048.github.io', fontsize=12, ha='center', va='center',
                        transform=ax.transAxes, color='grey', alpha=0.5]
                plt.gca[].invert_yaxis[]

                fig.tight_layout[]
            
        

1. Hồi quy tuyến tính đa

Mô hình hồi quy tuyến tính có cấu trúc sau:

$$ y = \ beta_1 x_1 + \ beta_2 x_2 + \ cdots + \ beta_n x_n + \ beta_0 \ tag {1} $$

ở đâu

$ \ beta_n $

: hệ số hồi quy [trọng lượng] của tính năng $ n $ -th$n$-th feature

Mô hình hồi quy tuyến tính bivarate [có thể được hiển thị trong không gian 2D] là sự đơn giản hóa EQ [1]. Mô hình bivariate có cấu trúc sau:

$$ y = \ beta_1 x_1 + \ beta_0 \ tag {2} $$

Một bưc tranh đang gia ngan lơi noi. Chúng ta hãy cố gắng hiểu các thuộc tính của nhiều mô hình hồi quy tuyến tính với trực quan hóa. Đầu tiên, mô hình hồi quy tuyến tính 2D bivariate được hiển thị trong Hình [2], sử dụng POR làm một tính năng duy nhất. Mặc dù độ xốp là tính năng quan trọng nhất liên quan đến sản xuất khí, nhưng chỉ có độ xốp chỉ chiếm 74% phương sai của dữ liệu.

Hình 2: Mô hình hồi quy tuyến tính 2D

Mã nguồn cho Hình [2]

            
                import pandas as pd
                import matplotlib.pyplot as plt
                from sklearn import linear_model

                ######################################## Data preparation ######################################### 

                file = '//aegis4048.github.io/downloads/notebooks/sample_data/unconv_MV_v5.csv'
                df = pd.read_csv[file]

                X = df['Por'].values.reshape[-1,1]
                y = df['Prod'].values

                ################################################ Train ############################################# 

                ols = linear_model.LinearRegression[]
                model = ols.fit[X, y]
                response = model.predict[X]

                ############################################## Evaluate ############################################ 

                r2 = model.score[X, y]

                ############################################## Plot ################################################

                plt.style.use['default']
                plt.style.use['ggplot']

                fig, ax = plt.subplots[figsize=[8, 4]]

                ax.plot[X, response, color='k', label='Regression model']
                ax.scatter[X, y, edgecolor='k', facecolor='grey', alpha=0.7, label='Sample data']
                ax.set_ylabel['Gas production [Mcf/day]', fontsize=14]
                ax.set_xlabel['Porosity [%]', fontsize=14]
                ax.text[0.8, 0.1, 'aegis4048.github.io', fontsize=13, ha='center', va='center',
                         transform=ax.transAxes, color='grey', alpha=0.5]
                ax.legend[facecolor='white', fontsize=11]
                ax.set_title['$R^2= %.2f$' % r2, fontsize=18]

                fig.tight_layout[]
            
        

Làm thế nào mô hình sẽ trông như thế nào trong không gian 3D? Chúng ta hãy xem hình [3]. Do tính chất 3D của cốt truyện, nhiều lô được tạo ra từ các góc độ khác nhau. Hai tính năng [por và giòn] đã được sử dụng để dự đoán biến phản ứng prod. Với sự trợ giúp của tính năng bổ sung giòn, mô hình tuyến tính trải nghiệm độ chính xác đáng kể, hiện nắm bắt độ biến thiên của dữ liệu 93%.

Hình 3: Mô hình hồi quy tuyến tính 3D với các tính năng mạnh mẽ

Mã nguồn cho Hình [3]

            
                import pandas as pd
                import numpy as np
                import matplotlib.pyplot as plt
                from sklearn import linear_model
                from mpl_toolkits.mplot3d import Axes3D

                ######################################## Data preparation #########################################

                file = '//aegis4048.github.io/downloads/notebooks/sample_data/unconv_MV_v5.csv'
                df = pd.read_csv[file]

                X = df[['Por', 'Brittle']].values.reshape[-1,2]
                Y = df['Prod']

                ######################## Prepare model data point for visualization ###############################

                x = X[:, 0]
                y = X[:, 1]
                z = Y

                x_pred = np.linspace[6, 24, 30]   # range of porosity values
                y_pred = np.linspace[0, 100, 30]  # range of brittleness values
                xx_pred, yy_pred = np.meshgrid[x_pred, y_pred]
                model_viz = np.array[[xx_pred.flatten[], yy_pred.flatten[]]].T

                ################################################ Train #############################################

                ols = linear_model.LinearRegression[]
                model = ols.fit[X, Y]
                predicted = model.predict[model_viz]

                ############################################## Evaluate ############################################

                r2 = model.score[X, Y]

                ############################################## Plot ################################################

                plt.style.use['default']

                fig = plt.figure[figsize=[12, 4]]

                ax1 = fig.add_subplot[131, projection='3d']
                ax2 = fig.add_subplot[132, projection='3d']
                ax3 = fig.add_subplot[133, projection='3d']

                axes = [ax1, ax2, ax3]

                for ax in axes:
                    ax.plot[x, y, z, color='k', zorder=15, linestyle='none', marker='o', alpha=0.5]
                    ax.scatter[xx_pred.flatten[], yy_pred.flatten[], predicted, facecolor=[0,0,0,0], s=20, edgecolor='#70b3f0']
                    ax.set_xlabel['Porosity [%]', fontsize=12]
                    ax.set_ylabel['Brittleness', fontsize=12]
                    ax.set_zlabel['Gas Prod. [Mcf/day]', fontsize=12]
                    ax.locator_params[nbins=4, axis='x']
                    ax.locator_params[nbins=5, axis='x']

                ax1.text2D[0.2, 0.32, 'aegis4048.github.io', fontsize=13, ha='center', va='center',
                           transform=ax1.transAxes, color='grey', alpha=0.5]
                ax2.text2D[0.3, 0.42, 'aegis4048.github.io', fontsize=13, ha='center', va='center',
                           transform=ax2.transAxes, color='grey', alpha=0.5]
                ax3.text2D[0.85, 0.85, 'aegis4048.github.io', fontsize=13, ha='center', va='center',
                           transform=ax3.transAxes, color='grey', alpha=0.5]

                ax1.view_init[elev=28, azim=120]
                ax2.view_init[elev=4, azim=114]
                ax3.view_init[elev=60, azim=165]

                fig.suptitle['$R^2 = %.2f$' % r2, fontsize=20]

                fig.tight_layout[]
            
        

Mô hình tuyến tính 3D sẽ trông như thế nào nếu các tính năng ít mạnh hơn được chọn? Hãy chọn POR và VR làm tính năng mới của chúng tôi và phù hợp với mô hình tuyến tính. Trong hình [4] bên dưới, chúng ta thấy rằng R bình phương giảm so với hình [3] ở trên. Ảnh hưởng của hiệu suất mô hình giảm có thể được quan sát trực quan bằng cách so sánh các lô giữa của chúng; Các sơ đồ phân tán trong hình [3] có dày đặc hơn xung quanh mặt phẳng mô hình 2D so với các ô phân tán trong hình [4].

Hình 4: Mô hình hồi quy tuyến tính 3D với các tính năng yếu

Mã nguồn cho Hình [4]

            
                import pandas as pd
                import numpy as np
                import matplotlib.pyplot as plt
                from sklearn import linear_model
                from mpl_toolkits.mplot3d import Axes3D

                ######################################## Data preparation #########################################

                file = '//aegis4048.github.io/downloads/notebooks/sample_data/unconv_MV_v5.csv'
                df = pd.read_csv[file]

                X = df[['Por', 'VR']].values.reshape[-1,2]
                Y = df['Prod']

                ######################## Prepare model data point for visualization ###############################

                x = X[:, 0]
                y = X[:, 1]
                z = Y

                x_pred = np.linspace[6, 24, 30]      # range of porosity values
                y_pred = np.linspace[0.93, 2.9, 30]  # range of VR values
                xx_pred, yy_pred = np.meshgrid[x_pred, y_pred]
                model_viz = np.array[[xx_pred.flatten[], yy_pred.flatten[]]].T

                ################################################ Train #############################################

                ols = linear_model.LinearRegression[]
                model = ols.fit[X, Y]
                predicted = model.predict[model_viz]

                ############################################## Evaluate ############################################

                r2 = model.score[X, Y]

                ############################################## Plot ################################################

                plt.style.use['default']

                fig = plt.figure[figsize=[12, 4]]

                ax1 = fig.add_subplot[131, projection='3d']
                ax2 = fig.add_subplot[132, projection='3d']
                ax3 = fig.add_subplot[133, projection='3d']

                axes = [ax1, ax2, ax3]

                for ax in axes:
                    ax.plot[x, y, z, color='k', zorder=15, linestyle='none', marker='o', alpha=0.5]
                    ax.scatter[xx_pred.flatten[], yy_pred.flatten[], predicted, facecolor=[0,0,0,0], s=20, edgecolor='#70b3f0']
                    ax.set_xlabel['Porosity [%]', fontsize=12]
                    ax.set_ylabel['VR', fontsize=12]
                    ax.set_zlabel['Gas Prod. [Mcf/day]', fontsize=12]
                    ax.locator_params[nbins=4, axis='x']
                    ax.locator_params[nbins=5, axis='x']

                ax1.text2D[0.2, 0.32, 'aegis4048.github.io', fontsize=13, ha='center', va='center',
                           transform=ax1.transAxes, color='grey', alpha=0.5]
                ax2.text2D[0.3, 0.42, 'aegis4048.github.io', fontsize=13, ha='center', va='center',
                           transform=ax2.transAxes, color='grey', alpha=0.5]
                ax3.text2D[0.85, 0.85, 'aegis4048.github.io', fontsize=13, ha='center', va='center',
                           transform=ax3.transAxes, color='grey', alpha=0.5]

                ax1.view_init[elev=27, azim=112]
                ax2.view_init[elev=16, azim=-51]
                ax3.view_init[elev=60, azim=165]

                fig.suptitle['$R^2 = %.2f$' % r2, fontsize=20]

                fig.tight_layout[]
            
        

Chế độ xem đầy đủ của các mô hình tuyến tính được xây dựng dưới đây dưới dạng GIF. Lưu ý rằng mặt phẳng màu xanh luôn được chiếu tuyến tính, bất kể góc độ. Đây là lý do mà chúng tôi gọi đây là mô hình hồi quy "tuyến tính" nhiều. Mô hình sẽ luôn luôn là tuyến tính, bất kể tính chiều của các tính năng của bạn. Khi bạn có nhiều hơn 3 tính năng, mô hình sẽ rất khó được hiển thị, nhưng bạn có thể mong đợi rằng các mô hình tuyến tính có chiều cao cũng sẽ thể hiện xu hướng tuyến tính trong không gian tính năng của chúng.

Hình 5: Độ xốp và độ giòn mô hình tuyến tính GIF

Hình 6: Độ xốp và mô hình tuyến tính VR GIF

GIF được tạo bằng cách tạo 360 lô khác nhau được xem từ các góc khác nhau với đoạn mã sau và kết hợp thành một GIF từ IMGFLIP.

In [ ]:

for ii in np.arange[0, 360, 1]:
    ax.view_init[elev=32, azim=ii]
    fig.savefig['gif_image%d.png' % ii]

Ghi chú: Mã hóa dữ liệu - hồi quy với các biến phân loại

Hồi quy đòi hỏi các tính năng phải liên tục. Điều gì xảy ra nếu bạn có các tính năng phân loại quan trọng? Bạn có phải bỏ qua các biến phân loại và chỉ chạy hồi quy với các biến liên tục? Chúng ta có thể mã hóa các biến phân loại thành các biến số để tránh vấn đề này. Hãy xem hình dưới đây. Cấp độ tính năng ban đầu là một biến thể loại với ba loại thời gian. Điều này có nghĩa là có hệ thống phân cấp giữa các loại [ví dụ: thấp

Bài Viết Liên Quan

Chủ Đề