{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 선형 회귀 (Linear Regression)\n", "\n", "선형 회귀는 연속적인 값을 예측하기 위한 회귀 알고리즘입니다. 주로 종속 변수와 독립 변수 간의 선형 관계를 모델링하는 데 사용됩니다.\n", "\n", "### 수식\n", "​ \\(y = \\beta_0 + \\beta_1x_1 + \\beta_2x_2 + ... + \\beta_nx_n + \\epsilon\\)\n", " - \\(y\\): 예측값\n", " - \\(x_1, x_2, ..., x_n\\): 독립 변수들\n", " - \\(\\beta_0, \\beta_1, ..., \\beta_n\\): 회귀 계수\n", " - \\(\\epsilon\\): 오차 항\n", " \n", "### 목적\n", "오차 항 ϵ의 제곱합을 최소화하는 회귀 계수를 찾는 것입니다.\n", "\n", "### 사용 사례\n", "주택 가격 예측, 연봉 예측, 판매량 예측 등 연속적인 값을 가지는 대상을 예측할 때 사용됩니다." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Coefficients: [[2.50779446]]\n", "Intercept: [4.64634325]\n" ] } ], "source": [ "from sklearn.linear_model import LinearRegression\n", "from sklearn.model_selection import train_test_split\n", "import numpy as np\n", "\n", "# 예제 데이터 생성\n", "X = np.random.rand(100, 1) * 10 # 100개의 랜덤 데이터\n", "y = 2.5 * X + 5 + np.random.randn(100, 1) * 2 # y = 2.5x + 5 + 잡음\n", "\n", "# 데이터 분할\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)\n", "\n", "# 선형 회귀 모델 학습\n", "model = LinearRegression()\n", "model.fit(X_train, y_train)\n", "\n", "# 예측\n", "y_pred = model.predict(X_test)\n", "\n", "print(\"Coefficients:\", model.coef_)\n", "print(\"Intercept:\", model.intercept_)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# diabetes 데이터셋\n", "\n", "### 개요\n", " - 위스콘신 대학의 유방암 진단 데이터셋으로, 유방암 종양의 임상 정보를 기반으로 악성(malignant) 또는 양성(benign)으로 분류하는 문제에 사용됩니다.\n", "\n", "### 특징\n", " - 30개의 특징 변수가 있으며, 이는 종양의 다양한 특성(크기, 반경, 질감 등)을 나타냅니다.\n", "\n", "### 목표 변수\n", " - 종양이 악성인지(1) 양성인지(0)를 나타내는 이진 값입니다.\n", "\n", "### 용도\n", " - 이 데이터셋은 주로 분류 문제에 사용됩니다.\n", "\n", "### 속성\n", " - age: 나이\n", " - sex: 성별\n", " - bmi: 체질량지수\n", " - bp: 평균 혈압\n", " - s1 ~ s6: 6개의 혈청 측정값" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Mean Squared Error: 4061.83\n" ] } ], "source": [ "import numpy as np\n", "from sklearn import datasets\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.linear_model import LinearRegression\n", "from sklearn.metrics import mean_squared_error\n", "\n", "# 데이터 로드\n", "diabetes = datasets.load_diabetes()\n", "X = diabetes.data[:, np.newaxis, 2] # BMI feature만 사용\n", "y = diabetes.target\n", "\n", "# 데이터 분할\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n", "\n", "# 선형 회귀 모델 학습\n", "model = LinearRegression()\n", "model.fit(X_train, y_train)\n", "\n", "# 예측 및 평가\n", "y_pred = model.predict(X_test)\n", "mse = mean_squared_error(y_test, y_pred)\n", "print(f\"Mean Squared Error: {mse:.2f}\")\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 로지스틱 회귀 (Logistic Regression)\n", "로지스틱 회귀는 이름에 '회귀'가 들어가지만, 분류 문제에 사용되는 알고리즘입니다. 주로 이진 분류 문제에 사용되며, 확률을 출력으로 가집니다.\n", "\n", "### 수식\n", " - \\(P(Y=1) = \\frac{1}{1 + e^{-(\\beta_0 + \\beta_1x_1 + \\beta_2x_2 + ... + \\beta_nx_n)}}\\)\n", " - \\(P(Y=1)\\): 클래스 1에 속할 확률\n", " - \\(x_1, x_2, ..., x_n\\): 독립 변수들\n", " - \\(\\beta_0, \\beta_1, ..., \\beta_n\\): 회귀 계수\n", "\n", "### 목적\n", " - 로그 오즈를 최대화하는 것입니다. 로그 오즈는 실제 값과 예측 확률 간의 로그 비율로 계산됩니다.\n", "\n", "### 사용 사례\n", " - 스팸 메일 분류, 환자의 질병 발병 여부 예측, 고객 이탈 여부 예측 등 이진 분류 문제에 주로 사용됩니다. 다중 클래스 분류에도 확장하여 사용할 수 있습니다." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from sklearn.linear_model import LogisticRegression\n", "from sklearn.model_selection import train_test_split\n", "\n", "# 예제 데이터 생성\n", "X = np.random.rand(100, 1) * 10 # 100개의 랜덤 데이터\n", "y = (X > 5).astype(int).ravel() # X가 5보다 크면 1, 아니면 0\n", "\n", "# 데이터 분할\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)\n", "\n", "# 로지스틱 회귀 모델 학습\n", "model = LogisticRegression()\n", "model.fit(X_train, y_train)\n", "\n", "# 예측\n", "y_pred = model.predict(X_test)\n", "\n", "print(\"Coefficients:\", model.coef_)\n", "print(\"Intercept:\", model.intercept_)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# breast_cancer 데이터셋\n", "\n", "### 개요\n", " - 위스콘신 대학의 유방암 진단 데이터셋으로, 유방암 종양의 임상 정보를 기반으로 악성(malignant) 또는 양성(benign)으로 분류하는 문제에 사용됩니다.\n", "\n", "### 특징\n", " - 30개의 특징 변수가 있으며, 이는 종양의 다양한 특성(크기, 반경, 질감 등)을 나타냅니다.\n", "\n", "### 목표 변수\n", " - 종양이 악성인지(1) 양성인지(0)를 나타내는 이진 값입니다.\n", "\n", "### 용도\n", " - 이 데이터셋은 주로 분류 문제에 사용됩니다." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Accuracy: 95.61%\n" ] } ], "source": [ "from sklearn import datasets\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn.metrics import accuracy_score\n", "\n", "# 데이터 로드\n", "cancer = datasets.load_breast_cancer()\n", "X = cancer.data\n", "y = cancer.target\n", "\n", "# 데이터 분할\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n", "\n", "# 로지스틱 회귀 모델 학습\n", "model = LogisticRegression(max_iter=10000) # max_iter를 증가시켜 수렴을 도움\n", "model.fit(X_train, y_train)\n", "\n", "# 예측 및 평가\n", "y_pred = model.predict(X_test)\n", "acc = accuracy_score(y_test, y_pred)\n", "print(f\"Accuracy: {acc*100:.2f}%\")\n" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.11" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }