-
선형회귀(LinearRegression) in pythondata-science-summary/summary 2020. 9. 17. 21:51반응형
<엔지니어는 구현을 못하면 모르는것이다>
선형회귀(LinearRegression)
한개이상의 독립변수와 종속변수와의 선형적인 상관관계를 모델링하는 회귀 분석 기법
독립변수 개수에따라 하나면 단순 선형회귀, 두개 이상이면 다중 선형회귀라고함
일반적으로 최소 제곱법(least square method) 을 사용회 선형 회귀 모델을 만듦
sklearn, statsmodels 등의 패키지를 이용하여 회귀분석을 수행한다.# 선형 회귀 LinearRegression sklearn from sklearn import datasets from sklearn.model_selection import train_test_split import numpy as np import pandas as pd datas = datasets.load_diabetes() datas.target df = pd.DataFrame(datas.data, columns = datas.feature_names) y = pd.DataFrame(datas.target, columns = ['y']) df = pd.concat([df, y], axis=1) train, test = train_test_split(df, test_size=0.3, random_state=123) cols = train.columns from sklearn.linear_model import LinearRegression # 독립변수 == 설명 변수 # 선형회귀 - 절편 있는 경우 lr = LinearRegression() # 절편(intercept) 없는 경우 # lr = LinearRegression(fit_intercept=False) lr.fit(train.iloc[:, :-1], train.y) pred = lr.predict(test.iloc[:, :-1]) # print(pred) # 회귀 계수 구할떄 lr.coef_ # 영향력이 큰 또는 예측값이 큰 변수 구할떄 = 회귀계수 가장 큰값과 해당 변수명 구하기 print(lr.coef_[lr.coef_.argmax()]) print(cols[lr.coef_.argmax()]) # 절편 구할떄 lr.intercept_ # [1,1,1,1,1,1,1,1,1,?] 이고 y = 100 일떄 ? 값 arr = [1,1,1,1,1,1,1,1,1, '?'] arr = arr[:-1] ans = (100 - lr.intercept_ - np.dot(arr, lr.coef_[:-1].reshape(-1, 1)))/lr.coef_[-1] print(ans) # 결정계수 # 선형회귀분석에서 종속변수에 대한 설명변수들의 설명력을 알고자 할때 사용 # 총변동중 회귀선에 의한 변동이 차지하는 비율 # r2 = 0.4 == 약 40% 설명 from sklearn.metrics import r2_score # 결정 계수 print(r2_score(test.y, pred))
statsmodels 사용 (식 직접 적는법)
# 선형 회귀 LinearRegression - statsmodel.formula.api 사용 from statsmodels.formula.api import ols s = 'y ~ ' for i, c in enumerate(cols[:-1]): if i==0: s = s + c continue s = s +'+'+ c # 아래 summary에서 P>|t| 를 통해 유의미한 개수 확인 가능 => 0.05 보다 작은 경우 유의미함 ols(s, df).fit().summary()
statsmodels 사용 (바로 X, y 대입)
# 선형 회귀 LinearRegression - statsmodel.api 사용 from statsmodels.api import OLS, add_constant # const 칼럼 추가 # add_constant 안하면 r2 score 구할떄에 uncentered 되어 조금 다르게 나옴 train_data = add_constant(train) model = OLS(train_data.y, train_data.drop(columns='y')).fit() # 유의미한 변수 확인 p_cols = model.pvalues.index[model.pvalues <=0.05] print(p_cols) # 유의미한 변수로 재학습 train_data_x = train_data[list(p_cols)[1:] + ['y']] train_data_x = add_constant(train_data_x) train_data_x model = OLS(train_data_x.y, train_data_x.drop(columns='y')).fit() test_data_x = test[list(p_cols[1:]) + ['y']] test_data_x = add_constant(test_data_x) pred = model.predict(test_data_x.drop(columns='y')) # 모델 살펴보기 print(model.summary()) # 모델 coefficient 추출 print(model.params) # 모델 p_valeus 추출 print(model.pvalues) # 모델 t_values print(model.tvalues) # 결정계수 print(model.rsquared) # 수정된 결정 계수 print(model.rsquared_adj)
반응형'data-science-summary > summary' 카테고리의 다른 글
VIF(Variance Inflation Factor) 분산팽창지수 in python (0) 2020.09.18 결정 계수 in python (0) 2020.09.17 상관분석 (Correlation) in python (0) 2020.09.16 Data를 train 과 test set으로 원하는 비율만큼 분리하는법 (0) 2020.09.16 PCA in python (0) 2020.09.16