특정한 입력변수값을 사용하여 출력변수의 값을 계산하는 것을 예측(prediction)문제라고 한다. 예측문제 중에서 출력변수의 값이 연속값인 문제를 회귀(regression) 또는 회귀분석(regression analysis) 문제라고 한다. 이 절에서는 회귀분석의 몇가지 예를 들어본다. 보스턴 집값 예측¶sklearn 패키지의 datasets 서브패키지는 회귀분석을 공부하기 위한 예제를 제공한다. 그 중
from sklearn.datasets import load_boston boston = load_boston() dir(boston) ['DESCR', 'data', 'feature_names', 'filename', 'target'] 분석할 데이터는 pandas 데이터프레임 형태로 만들어야 한다. 여기에서는 독립변수 행렬을 dfX = pd.DataFrame(boston.data, columns=boston.feature_names) dfy = pd.DataFrame(boston.target, columns=["MEDV"]) 독립변수과 종속변수 데이터프레임을 하나의 데이터프레임으로 묶어두면 편리하다. df = pd.concat([dfX, dfy], axis=1) df.tail()
일부 독립변수와 종속변수의 관계를 스캐터플롯(scatter plot)으로 살펴보자. sns.pairplot(df[["MEDV", "RM", "AGE", "CHAS"]]) plt.show() 이 플롯의 첫 행을 보면 종속변수인 집값(MEDV)과 방 개수(RM), 노후화 정도(AGE)와 어떤 관계를 가지는지 알 수 있다.
또한 스케터플롯의 모양으로부터 찰스강 유역 여부(CHAS)는 범주값이며 값이 1이면 0일 때 보다 집값의 평균이 더 높아지는 것도 볼 수 있다. 당뇨병 진행도 예측¶scikit-learn 패키지가 제공하는 당뇨병 진행도 예측용 데이터는 442명의 당뇨병 환자를 대상으로한 검사 결과를 나타내는 데이터이다. 다음과 같은 10 종류의 독립변수를 가지고 있다. 독립변수의 값들은 모두 스케일링(scaling)되었다.
종속변수는 1년 뒤 측정한 당뇨병의 진행률이다. from sklearn.datasets import load_diabetes diabetes = load_diabetes() df = pd.DataFrame(diabetes.data, columns=diabetes.feature_names) df["target"] = diabetes.target df.tail()
스케터플롯을 그려보면 독립변수인 BMI지수와 평균혈압이 종속변수인 당뇨병 진행도와 양의 상관관계를 가지는 것을 볼 수 있다. 또한 두 독립변수 BMI지수와 평균혈압도 서로 양의 상관관계를 가진다. 이렇게 독립변수끼리 상관관계를 가지는 것을 다중공선성(multicolinearity)이라고 한다. 다중공선성은 회귀분석의 결과에 영향을 미칠 수 있다. sns.pairplot(df[["target", "bmi", "bp", "s1"]]) plt.show() 연습 문제 4.1.1¶sklearn.datasets 패키지의 가상 데이터 예측¶scikit-learn 패키지는 가상의 회귀분석 문제를 만들어주는 X, y, w = make_regression(n_samples, n_features, bias, noise, random_state, coef=True)
출력은 다음과 같다.
\[ y = w^Tx + b + \epsilon \] from sklearn.datasets import make_regression X, y, w = make_regression( n_samples=50, n_features=1, bias=100, noise=10, coef=True, random_state=0 ) xx = np.linspace(-3, 3, 100) y0 = w * xx + 100 plt.plot(xx, y0, "r-") plt.scatter(X, y, s=100) plt.xlabel("x") plt.ylabel("y") plt.title("make_regression 예제") plt.show()
연습 문제 4.1.2¶
따라서 함수 사용법은 다음과 같아야 한다. X, y, w = make_regression2(n_samples, bias, noise, random_state) 독립변수가 2개인 표본 데이터를 생성하여 스캐터플롯을 그리면 다음과 같다. 종속변숫값은 점의 명암으로 표시하였다. 점의 밝기가 밝으면 종속변숫값이 큰 것이고 점의 밝기가 어두우면 종속변숫값이 작은것이다. 스캐터플롯에서 x1, x2가 증가할수록 종속변숫값이 커지는 것을 알 수 있다. X, y, w = make_regression( n_samples=300, n_features=2, noise=10, coef=True, random_state=0 ) plt.scatter(X[:, 0], X[:, 1], c=y, s=100, cmap=mpl.cm.bone) plt.xlabel("x1") plt.ylabel("x2") plt.axis("equal") plt.title("두 독립변수가 서로 독립이고 둘 다 종속변수와 상관 관계가 있는 경우") plt.show()
예를 들어 두 독립변수 중 실제로 종속변수에 영향을 미치는 독립변수는 하나 뿐이라면 다음처럼 X, y, w = make_regression( n_samples=300, n_features=2, n_informative=1, noise=0, coef=True, random_state=0 ) plt.scatter(X[:, 0], X[:, 1], c=y, s=100, cmap=mpl.cm.bone) plt.xlabel("x1") plt.ylabel("x2") plt.axis("equal") plt.title("두 독립변수가 서로 독립이고 둘 중 하나만 종속변수와 상관 관계가 있는 경우") plt.show() 만약 두 독립변수가 서로 독립이 아니고 상관관계를 가지는 다중공선성 데이터를 만드는 경우에는 X, y, w = make_regression( n_samples=300, n_features=2, effective_rank=1, noise=0, coef=True, random_state=0, tail_strength=0 ) plt.scatter(X[:, 0], X[:, 1], c=y, s=100, cmap=mpl.cm.bone) plt.xlabel("x1") plt.ylabel("x2") plt.axis("equal") plt.title("두 독립변수가 독립이 아닌 경우") plt.show() |