Mã Python mã GLM

Trong chương này, chúng ta sẽ khám phá cách khớp các mô hình tuyến tính chung trong Python. Chúng tôi sẽ tập trung vào các công cụ được cung cấp bởi gói

3

from nhanes.load import load_NHANES_data
nhanes_data = load_NHANES_data[]
adult_nhanes_data = nhanes_data.query['AgeInYearsAtScreening > 17']

Hồi quy tuyến tính

Để thực hiện hồi quy tuyến tính trong Python, chúng tôi sử dụng hàm

4 [viết tắt của bình phương nhỏ nhất thông thường] từ gói 
3. Hãy tạo một số dữ liệu mô phỏng và sử dụng hàm này để tính toán giải pháp hồi quy tuyến tính

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


def generate_linear_data[slope, intercept,
                         noise_sd=1, x=None, 
                         npoints=100, seed=None]:
    """
    generate data with a given slope and intercept
    and add normally distributed noise

    if x is passed as an argument then a given x will be used,
    otherwise it will be generated randomly

    Returns:
    --------
    a pandas data frame with variables x and y
    """
    if seed is not None:
        np.random.seed[seed]
    if x is None:
        x = np.random.randn[npoints]
    
    y = x * slope + intercept + np.random.randn[x.shape[0]] * noise_sd
    return[pd.DataFrame[{'x': x, 'y': y}]]


slope = 1
intercept = 10
noise_sd = 1
simulated_data = generate_linear_data[slope, intercept, noise_sd, seed=1]

plt.scatter[simulated_data['x'], simulated_data['y']]

Sau đó, chúng ta có thể thực hiện hồi quy tuyến tính trên những dữ liệu này bằng cách sử dụng hàm

6. Chức năng này không tự động bao gồm một phần chặn trong mô hình của nó, vì vậy chúng tôi cần thêm một phần vào thiết kế. Lắp mô hình bằng chức năng này là một quy trình gồm hai bước. Đầu tiên, chúng tôi thiết lập mô hình và lưu trữ nó vào một biến [mà chúng tôi sẽ gọi là 
7]. Sau đó, chúng tôi thực sự điều chỉnh mô hình, mô hình này tạo ra kết quả mà chúng tôi lưu trữ vào một biến khác có tên là 
8 và xem tóm tắt bằng phương pháp 
9 của biến kết quả

from nhanes.load import load_NHANES_data
nhanes_data = load_NHANES_data[]
adult_nhanes_data = nhanes_data.query['AgeInYearsAtScreening > 17']
0

Kết quả hồi quy OLSDep. Biến đổi. yR-bình phương. 0. 522Mô hình. OLSAdj. bình phương R. 0. 517Phương pháp. Số bình phương nhỏ nhất F-statistic. 107. 0Ngày. Thứ ba, ngày 31 tháng 8 năm 2021Prob [F-statistic]. 2. 20e-17Thời gian. 14. 59. 55Log-Khả năng. -134. 44Không. quan sát. 100AIC. 272. 9Df dư. 98BIC. 278. Mô hình 1Df. 1Loại hiệp phương sai. nonrobustcoefstd errtP>. t. [0. 0250. 975]Đánh chặn10. 14700. 094107. 9730. 0009. 96110. 334x1. 09540. 10610. 3420. 0000. 8851. 306Xe vạn năng. 0. 898Durbin-Watson. 2. 157Prob[Xe đa năng]. 0. 638Jarque-Bera [JB]. 0. 561Xiên. -0. 172Prob[JB]. 0. 755Kurtosis. 3. 127Điều kiện. Không. 1. 15

Cảnh báo.
[1] Lỗi chuẩn giả định rằng ma trận hiệp phương sai của các lỗi được chỉ định chính xác.

Chúng ta sẽ thấy ba điều trong những kết quả này

  • Ước tính của Giao điểm trong mô hình phải rất gần với giao điểm chặn mà chúng tôi đã chỉ định

  • Ước tính cho tham số x phải rất gần với độ dốc mà chúng tôi đã chỉ định

  • Độ lệch chuẩn dư phải gần giống với độ lệch chuẩn nhiễu mà chúng tôi đã chỉ định. Bản tóm tắt không trực tiếp báo cáo độ lệch chuẩn còn lại nhưng chúng ta có thể tính toán nó bằng cách sử dụng số dư được lưu trữ trong phần tử

    from nhanes.load import load_NHANES_data
    nhanes_data = load_NHANES_data[]
    adult_nhanes_data = nhanes_data.query['AgeInYearsAtScreening > 17']
    
    00 ở đầu ra kết quả

Phê bình và chẩn đoán mô hình

Khi chúng tôi đã lắp mô hình, chúng tôi muốn xem xét một số chẩn đoán để xác định xem mô hình có thực sự vừa vặn hay không.
Điều đầu tiên cần kiểm tra là đảm bảo rằng phần dư [ít nhất là đại khái] có phân phối chuẩn. Chúng ta có thể làm điều này bằng cách sử dụng biểu đồ QQ.

from nhanes.load import load_NHANES_data
nhanes_data = load_NHANES_data[]
adult_nhanes_data = nhanes_data.query['AgeInYearsAtScreening > 17']
2

Điều này có vẻ khá tốt, theo nghĩa là các điểm dữ liệu còn lại rất gần với đường đơn vị. Điều này không có gì đáng ngạc nhiên, vì chúng tôi đã tạo dữ liệu với nhiễu phân phối bình thường. Chúng ta cũng nên vẽ các giá trị dự đoán [hoặc phù hợp] với phần dư, để đảm bảo rằng mô hình hoạt động tốt hơn một cách có hệ thống đối với một số giá trị dự đoán so với các giá trị khác

from nhanes.load import load_NHANES_data
nhanes_data = load_NHANES_data[]
adult_nhanes_data = nhanes_data.query['AgeInYearsAtScreening > 17']
3

Như mong đợi, chúng tôi thấy không có mối quan hệ rõ ràng

Ví dụ về sự phù hợp của mô hình có vấn đề

Giả sử rằng có một biến khác đang diễn ra trong tập dữ liệu này mà chúng tôi không biết. Biến này khiến một số trường hợp có giá trị lớn hơn nhiều so với các trường hợp khác, theo cách không liên quan đến biến X. Ở đây chúng tôi chơi một mẹo nhỏ bằng cách sử dụng hàm

from nhanes.load import load_NHANES_data
nhanes_data = load_NHANES_data[]
adult_nhanes_data = nhanes_data.query['AgeInYearsAtScreening > 17']
01 để tạo một chuỗi từ 0 đến 1, sau đó đặt ngưỡng cho các 0 đó. 5 [để lấy một nửa giá trị bằng 0 và nửa còn lại bằng một] rồi nhân với kích thước hiệu ứng mong muốn

from nhanes.load import load_NHANES_data
nhanes_data = load_NHANES_data[]
adult_nhanes_data = nhanes_data.query['AgeInYearsAtScreening > 17']
5

Bây giờ chúng ta điều chỉnh mô hình một lần nữa và kiểm tra phần dư

from nhanes.load import load_NHANES_data
nhanes_data = load_NHANES_data[]
adult_nhanes_data = nhanes_data.query['AgeInYearsAtScreening > 17']
6

Sự thiếu chuẩn mực rõ ràng từ cốt truyện QQ và chúng ta cũng có thể thấy rằng có một cấu trúc rõ ràng trong phần dư

Hãy xem xét một vấn đề tiềm ẩn khác, trong đó biến y có quan hệ phi tuyến với biến X. Chúng ta có thể tạo những dữ liệu này bằng cách bình phương biến X khi chúng ta tạo biến Y

from nhanes.load import load_NHANES_data
nhanes_data = load_NHANES_data[]
adult_nhanes_data = nhanes_data.query['AgeInYearsAtScreening > 17']
7

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


def generate_linear_data[slope, intercept,
                         noise_sd=1, x=None, 
                         npoints=100, seed=None]:
    """
    generate data with a given slope and intercept
    and add normally distributed noise

    if x is passed as an argument then a given x will be used,
    otherwise it will be generated randomly

    Returns:
    --------
    a pandas data frame with variables x and y
    """
    if seed is not None:
        np.random.seed[seed]
    if x is None:
        x = np.random.randn[npoints]
    
    y = x * slope + intercept + np.random.randn[x.shape[0]] * noise_sd
    return[pd.DataFrame[{'x': x, 'y': y}]]


slope = 1
intercept = 10
noise_sd = 1
simulated_data = generate_linear_data[slope, intercept, noise_sd, seed=1]

plt.scatter[simulated_data['x'], simulated_data['y']]
0

Kết quả hồi quy OLSDep. Biến đổi. y3R-bình phương. 0. 008Mô hình. OLSAdj. bình phương R. -0. 002Phương pháp. Số bình phương nhỏ nhất F-statistic. 0. 8369Ngày. Thứ ba, ngày 31 tháng 8 năm 2021Prob [F-statistic]. 0. 363Time. 14. 59. 56Log-Khả năng. -149. 89Không. quan sát. 100AIC. 303. Dư 8Df. 98BIC. 309. 0Df Mẫu. 1Loại hiệp phương sai. nonrobustcoefstd errtP>. t. [0. 0250. 975]Đánh chặn10. 78130. 11098. 2950. 00010. 56410. 999x0. 11310. 1240. 9150. 363-0. 1320. 358Toàn thể. 62. 137Durbin-Watson. 1. 699Prob[Xe đa năng]. 0. 000Jarque-Bera [JB]. 203. 933Xiên. 2. 285Prob[JB]. 5. 21e-45Kurtosis. 8. 297Điều kiện. Không. 1. 15

Cảnh báo.
[1] Lỗi chuẩn giả định rằng ma trận hiệp phương sai của các lỗi được chỉ định chính xác.

Bây giờ chúng ta thấy rằng không có mối quan hệ tuyến tính đáng kể nào giữa \[X^2\] và Y/ Nhưng nếu chúng ta xem xét phần dư thì vấn đề với mô hình sẽ trở nên rõ ràng

plt. hình[figsize=[12, 6]] plt. ô con [1, 2, 1] scipy. số liệu thống kê. probplot[ols_result3. cư trú, cốt truyện = sns. mpl. pyplot]

plt. ô con[1, 2, 2] plt. phân tán [ols_result3. giá trị được trang bị, ols_result3. cư trú] plt. xlabel['Giá trị vừa vặn'] plt. ylabel['Dư']

Trong trường hợp này, chúng ta có thể thấy mối quan hệ phi tuyến tính rõ ràng giữa giá trị dự đoán và giá trị phần dư, cũng như sự thiếu chuẩn tắc rõ ràng trong phần dư

Như chúng ta đã lưu ý trong chương trước, “tuyến tính” trong mô hình tuyến tính chung không đề cập đến hình dạng của phản ứng, mà thay vào đó đề cập đến thực tế là mô hình là tuyến tính trong các tham số của nó - nghĩa là các yếu tố dự đoán trong mô hình . g. , thay vì được nâng lên lũy thừa của tham số]. Đây là cách chúng tôi xây dựng một mô hình có thể giải thích cho mối quan hệ phi tuyến tính, bằng cách sử dụng

from nhanes.load import load_NHANES_data
nhanes_data = load_NHANES_data[]
adult_nhanes_data = nhanes_data.query['AgeInYearsAtScreening > 17']
02 trong mô hình

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


def generate_linear_data[slope, intercept,
                         noise_sd=1, x=None, 
                         npoints=100, seed=None]:
    """
    generate data with a given slope and intercept
    and add normally distributed noise

    if x is passed as an argument then a given x will be used,
    otherwise it will be generated randomly

    Returns:
    --------
    a pandas data frame with variables x and y
    """
    if seed is not None:
        np.random.seed[seed]
    if x is None:
        x = np.random.randn[npoints]
    
    y = x * slope + intercept + np.random.randn[x.shape[0]] * noise_sd
    return[pd.DataFrame[{'x': x, 'y': y}]]


slope = 1
intercept = 10
noise_sd = 1
simulated_data = generate_linear_data[slope, intercept, noise_sd, seed=1]

plt.scatter[simulated_data['x'], simulated_data['y']]
1

Kết quả hồi quy OLSDep. Biến đổi. y3R-bình phương. 0. 992Mô hình. OLSAdj. bình phương R. 0. 992Phương pháp. Số bình phương nhỏ nhất F-statistic. 1. 243e+04Ngày. Thứ ba, ngày 31 tháng 8 năm 2021Prob [F-statistic]. 4. 87e-105Thời gian. 14. 59. 56Log-Khả năng. 92. 204Không. quan sát. 100AIC. -180. Dư 4Df. 98BIC. -175. Mô hình 2Df. 1Loại hiệp phương sai. nonrobustcoefstd errtP>. t. [0. 0250. 975]Đánh chặn10. 02150. 012841. 5680. 0009. 99810. 045x_squared0. 97400. 009111. 4730. 0000. 9570. 991Xe buýt toàn năng. 0. 981Durbin-Watson. 2. 260Prob[Xe đa năng]. 0. 612Jarque-Bera [JB]. 1. 073Xiên. 0. 216Prob[JB]. 0. 585Kurtosis. 2. 735Cond. Không. 2. 09

Cảnh báo.
[1] Lỗi chuẩn giả định rằng ma trận hiệp phương sai của các lỗi được chỉ định chính xác.

Bây giờ chúng ta thấy rằng ảnh hưởng của \[X^2\] là đáng kể và nếu chúng ta nhìn vào biểu đồ còn lại, chúng ta sẽ thấy rằng mọi thứ có vẻ tốt hơn nhiều

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


def generate_linear_data[slope, intercept,
                         noise_sd=1, x=None, 
                         npoints=100, seed=None]:
    """
    generate data with a given slope and intercept
    and add normally distributed noise

    if x is passed as an argument then a given x will be used,
    otherwise it will be generated randomly

    Returns:
    --------
    a pandas data frame with variables x and y
    """
    if seed is not None:
        np.random.seed[seed]
    if x is None:
        x = np.random.randn[npoints]
    
    y = x * slope + intercept + np.random.randn[x.shape[0]] * noise_sd
    return[pd.DataFrame[{'x': x, 'y': y}]]


slope = 1
intercept = 10
noise_sd = 1
simulated_data = generate_linear_data[slope, intercept, noise_sd, seed=1]

plt.scatter[simulated_data['x'], simulated_data['y']]
2

Không hoàn hảo, nhưng tốt hơn nhiều so với trước đây

Mở rộng hồi quy cho kết quả nhị phân

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


def generate_linear_data[slope, intercept,
                         noise_sd=1, x=None, 
                         npoints=100, seed=None]:
    """
    generate data with a given slope and intercept
    and add normally distributed noise

    if x is passed as an argument then a given x will be used,
    otherwise it will be generated randomly

    Returns:
    --------
    a pandas data frame with variables x and y
    """
    if seed is not None:
        np.random.seed[seed]
    if x is None:
        x = np.random.randn[npoints]
    
    y = x * slope + intercept + np.random.randn[x.shape[0]] * noise_sd
    return[pd.DataFrame[{'x': x, 'y': y}]]


slope = 1
intercept = 10
noise_sd = 1
simulated_data = generate_linear_data[slope, intercept, noise_sd, seed=1]

plt.scatter[simulated_data['x'], simulated_data['y']]
3

Bây giờ chúng tôi muốn xây dựng một mô hình cho phép chúng tôi dự đoán ai mắc bệnh tiểu đường, dựa trên tuổi và Chỉ số khối cơ thể [BMI] của họ. Tuy nhiên, bạn có thể nhận thấy rằng biến Bệnh tiểu đường là một biến nhị phân; . Chúng ta có thể điều chỉnh mô hình này bằng hàm

from nhanes.load import load_NHANES_data
nhanes_data = load_NHANES_data[]
adult_nhanes_data = nhanes_data.query['AgeInYearsAtScreening > 17']
03

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


def generate_linear_data[slope, intercept,
                         noise_sd=1, x=None, 
                         npoints=100, seed=None]:
    """
    generate data with a given slope and intercept
    and add normally distributed noise

    if x is passed as an argument then a given x will be used,
    otherwise it will be generated randomly

    Returns:
    --------
    a pandas data frame with variables x and y
    """
    if seed is not None:
        np.random.seed[seed]
    if x is None:
        x = np.random.randn[npoints]
    
    y = x * slope + intercept + np.random.randn[x.shape[0]] * noise_sd
    return[pd.DataFrame[{'x': x, 'y': y}]]


slope = 1
intercept = 10
noise_sd = 1
simulated_data = generate_linear_data[slope, intercept, noise_sd, seed=1]

plt.scatter[simulated_data['x'], simulated_data['y']]
4

Kết quả hồi quy logitDep. Biến đổi. Bệnh tiểu đườngKhông. quan sát. 5267Mô hình. Phần dư LogitDf. 5264Phương pháp. Mô hình MLEDf. 2Ngày. Thứ ba, ngày 31 tháng 8 năm 2021Pseudo R-squ. 0. 1661Thời gian. 14. 59. 56Log-Khả năng. -1895. 1 hội tụ. TrueLL-Null. -2272. 6Loại hiệp phương sai. giá trị p nonrobustLLR. 1. 122e-164coefstd errzP>. z. [0. 0250. 975]Đánh chặn-7. 31010. 276-26. 4780. 000-7. 851-6. 769Tuổi0. 06220. 00321. 7630. 0000. 0570. 068BMI0. 06930. 00512. 7690. 0000. 0590. 080

Điều này trông rất giống với kết quả đầu ra từ hàm

from nhanes.load import load_NHANES_data
nhanes_data = load_NHANES_data[]
adult_nhanes_data = nhanes_data.query['AgeInYearsAtScreening > 17']
04 và nó cho chúng ta thấy rằng có một mối quan hệ đáng kể giữa tuổi, cân nặng và bệnh tiểu đường. Mô hình cung cấp cho chúng tôi xác suất dự đoán rằng mỗi cá nhân sẽ mắc bệnh tiểu đường; . 5, thì điều đó có nghĩa là mô hình dự đoán rằng cá nhân đó có nhiều khả năng mắc bệnh tiểu đường hơn là không mắc bệnh tiểu đường.
Chúng ta có thể bắt đầu bằng cách so sánh những dự đoán đó với kết quả thực tế.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


def generate_linear_data[slope, intercept,
                         noise_sd=1, x=None, 
                         npoints=100, seed=None]:
    """
    generate data with a given slope and intercept
    and add normally distributed noise

    if x is passed as an argument then a given x will be used,
    otherwise it will be generated randomly

    Returns:
    --------
    a pandas data frame with variables x and y
    """
    if seed is not None:
        np.random.seed[seed]
    if x is None:
        x = np.random.randn[npoints]
    
    y = x * slope + intercept + np.random.randn[x.shape[0]] * noise_sd
    return[pd.DataFrame[{'x': x, 'y': y}]]


slope = 1
intercept = 10
noise_sd = 1
simulated_data = generate_linear_data[slope, intercept, noise_sd, seed=1]

plt.scatter[simulated_data['x'], simulated_data['y']]
5

LogitPrediction01Tiểu đường0440050175661

Bảng này cho thấy mô hình đã làm khá tốt, ở chỗ nó dán nhãn hầu hết những người không mắc bệnh tiểu đường là không mắc bệnh tiểu đường và hầu hết những người mắc bệnh tiểu đường là mắc bệnh tiểu đường. Tuy nhiên, nó cũng mắc rất nhiều sai lầm, ghi nhầm gần một nửa số người mắc bệnh tiểu đường là không mắc bệnh tiểu đường.

Chúng tôi thường muốn một con số duy nhất cho chúng tôi biết dự đoán của chúng tôi tốt như thế nào. Chúng ta có thể đơn giản hỏi trung bình có bao nhiêu dự đoán của chúng ta đúng

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


def generate_linear_data[slope, intercept,
                         noise_sd=1, x=None, 
                         npoints=100, seed=None]:
    """
    generate data with a given slope and intercept
    and add normally distributed noise

    if x is passed as an argument then a given x will be used,
    otherwise it will be generated randomly

    Returns:
    --------
    a pandas data frame with variables x and y
    """
    if seed is not None:
        np.random.seed[seed]
    if x is None:
        x = np.random.randn[npoints]
    
    y = x * slope + intercept + np.random.randn[x.shape[0]] * noise_sd
    return[pd.DataFrame[{'x': x, 'y': y}]]


slope = 1
intercept = 10
noise_sd = 1
simulated_data = generate_linear_data[slope, intercept, noise_sd, seed=1]

plt.scatter[simulated_data['x'], simulated_data['y']]
6

Điều này cho chúng tôi biết rằng chúng tôi đang dự đoán khá tốt, với độ chính xác trên 80%. Tuy nhiên, biện pháp này có vấn đề, vì hầu hết những người trong mẫu không mắc bệnh tiểu đường. Điều này có nghĩa là chúng ta có thể đạt được độ chính xác tương đối cao nếu chúng ta chỉ đơn giản nói rằng không có ai mắc bệnh tiểu đường

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


def generate_linear_data[slope, intercept,
                         noise_sd=1, x=None, 
                         npoints=100, seed=None]:
    """
    generate data with a given slope and intercept
    and add normally distributed noise

    if x is passed as an argument then a given x will be used,
    otherwise it will be generated randomly

    Returns:
    --------
    a pandas data frame with variables x and y
    """
    if seed is not None:
        np.random.seed[seed]
    if x is None:
        x = np.random.randn[npoints]
    
    y = x * slope + intercept + np.random.randn[x.shape[0]] * noise_sd
    return[pd.DataFrame[{'x': x, 'y': y}]]


slope = 1
intercept = 10
noise_sd = 1
simulated_data = generate_linear_data[slope, intercept, noise_sd, seed=1]

plt.scatter[simulated_data['x'], simulated_data['y']]
7

Một giá trị thường được sử dụng khi chúng ta có dự đoán được phân loại [như chúng ta làm ở đây, với xác suất được dự đoán bởi mô hình] được gọi là khu vực dưới đặc tính vận hành máy thu hoặc AUROC. Đây là một số nằm trong khoảng từ 0 đến 1, trong đó 0. 5 có nghĩa là chúng tôi đang đoán và một có nghĩa là dự đoán của chúng tôi là hoàn hảo. Hãy xem điều gì sẽ xảy ra với tập dữ liệu này, sử dụng

from nhanes.load import load_NHANES_data
nhanes_data = load_NHANES_data[]
adult_nhanes_data = nhanes_data.query['AgeInYearsAtScreening > 17']
05 từ gói scikit-learn

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


def generate_linear_data[slope, intercept,
                         noise_sd=1, x=None, 
                         npoints=100, seed=None]:
    """
    generate data with a given slope and intercept
    and add normally distributed noise

    if x is passed as an argument then a given x will be used,
    otherwise it will be generated randomly

    Returns:
    --------
    a pandas data frame with variables x and y
    """
    if seed is not None:
        np.random.seed[seed]
    if x is None:
        x = np.random.randn[npoints]
    
    y = x * slope + intercept + np.random.randn[x.shape[0]] * noise_sd
    return[pd.DataFrame[{'x': x, 'y': y}]]


slope = 1
intercept = 10
noise_sd = 1
simulated_data = generate_linear_data[slope, intercept, noise_sd, seed=1]

plt.scatter[simulated_data['x'], simulated_data['y']]
8

Mô hình của chúng tôi hoạt động tương đối tốt theo điểm số này. Điều gì sẽ xảy ra nếu chúng ta muốn biết liệu điều này có tốt hơn cơ hội không? . Sau đó, chúng tôi có thể hỏi khả năng điểm số quan sát của chúng tôi sẽ như thế nào nếu không có mối quan hệ thực sự

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


def generate_linear_data[slope, intercept,
                         noise_sd=1, x=None, 
                         npoints=100, seed=None]:
    """
    generate data with a given slope and intercept
    and add normally distributed noise

    if x is passed as an argument then a given x will be used,
    otherwise it will be generated randomly

    Returns:
    --------
    a pandas data frame with variables x and y
    """
    if seed is not None:
        np.random.seed[seed]
    if x is None:
        x = np.random.randn[npoints]
    
    y = x * slope + intercept + np.random.randn[x.shape[0]] * noise_sd
    return[pd.DataFrame[{'x': x, 'y': y}]]


slope = 1
intercept = 10
noise_sd = 1
simulated_data = generate_linear_data[slope, intercept, noise_sd, seed=1]

plt.scatter[simulated_data['x'], simulated_data['y']]
9

Điều này cho chúng tôi thấy rằng điểm quan sát của chúng tôi cao hơn tất cả 1000 điểm thu được bằng cách sử dụng hoán vị ngẫu nhiên. Vì vậy, chúng tôi có thể kết luận rằng độ chính xác của chúng tôi lớn hơn cơ hội. Tuy nhiên, điều này không cho chúng ta biết chúng ta có thể dự đoán liệu một người mới có mắc bệnh tiểu đường hay không. Đây là những gì chúng ta chuyển sang tiếp theo

xác thực chéo

Xác thực chéo là một kỹ thuật mạnh mẽ cho phép chúng tôi ước tính kết quả của chúng tôi sẽ tổng quát hóa tốt như thế nào đối với một tập dữ liệu mới. Ở đây chúng ta sẽ xây dựng mã xác thực chéo của riêng mình để xem nó hoạt động như thế nào, tiếp tục ví dụ về hồi quy logistic từ phần trước. Trong xác thực chéo, chúng tôi muốn chia dữ liệu thành nhiều tập hợp con và sau đó đào tạo mô hình lặp lại trong khi loại bỏ từng tập hợp con [mà chúng tôi thường gọi là nếp gấp] và sau đó kiểm tra mô hình trên nếp gấp được giữ lại đó. Chúng tôi có thể sử dụng một trong các công cụ từ gói scikit-learning để tạo các nếp gấp xác thực chéo cho chúng tôi. Hãy bắt đầu bằng cách sử dụng xác thực chéo 10 lần, trong đó chúng tôi chia dữ liệu thành 10 phần và khớp với mô hình trong khi giữ lại một trong những phần đó và sau đó thử nghiệm nó trên dữ liệu đã loại bỏ

0

1

2

Kết quả này cho thấy mô hình của chúng tôi có thể khái quát hóa tương đối tốt cho các cá nhân mới — trên thực tế, gần như tốt như mô hình ban đầu. Điều này là do cỡ mẫu của chúng tôi rất lớn;

GLM trong Python là gì?

Hàm glm[] phù hợp với các mô hình tuyến tính tổng quát, một loại mô hình bao gồm hồi quy logistic . Cú pháp của hàm glm[] tương tự như cú pháp của lm[] , ngoại trừ việc chúng ta phải truyền vào đối số family=sm.

Mã hóa GLM là gì?

Mô hình tuyến tính tổng quát hóa [GLM] là sự tổng quát hóa của hồi quy tuyến tính thông thường cho phép các biến phản hồi có mô hình phân phối lỗi khác với phân phối bình thường như phân phối Gaussian.

Công thức GLM là gì?

Mô hình tuyến tính chung [GLM] là một khung hữu ích để so sánh mức độ ảnh hưởng của một số biến đối với các biến liên tục khác nhau. Ở dạng đơn giản nhất, GLM được mô tả là. Dữ liệu = Mô hình + Lỗi [Rutherford, 2001, p. 3] GLM là nền tảng cho một số thử nghiệm thống kê, bao gồm ANOVA, ANCOVA và phân tích hồi quy.

GLM có giống như ANOVA không?

GLM khái quát hóa mô hình tuyến tính được sử dụng trong ANOVA bằng cách cho phép bất kỳ loại phân phối phần dư nào khác [và tối ưu hóa hàm khả năng, chỉ cho phép kiểm tra t dựa trên sai số ước tính của các hệ số]. Vì vậy, anova là Glm, nhưng Glm không chỉ là anova .

Chủ Đề