diff --git "a/week3/[MLNovice]\354\241\260\354\230\210\354\235\270_week3-1.ipynb" "b/week3/[MLNovice]\354\241\260\354\230\210\354\235\270_week3-1.ipynb" new file mode 100644 index 0000000..a0202d8 --- /dev/null +++ "b/week3/[MLNovice]\354\241\260\354\230\210\354\235\270_week3-1.ipynb" @@ -0,0 +1 @@ +{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"provenance":[],"authorship_tag":"ABX9TyPQWJCZo/Gi/6T9yGB+46vN"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"markdown","source":["# 럭키백의 확률"],"metadata":{"id":"Z0CJMJOEpp_L"}},{"cell_type":"code","execution_count":1,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":206},"id":"V5M_AL9gpSSj","executionInfo":{"status":"ok","timestamp":1728701797259,"user_tz":-540,"elapsed":1340,"user":{"displayName":"조예인","userId":"17650117334011908449"}},"outputId":"44ddc7b9-8ee0-402c-fd80-c2441a1dce35"},"outputs":[{"output_type":"execute_result","data":{"text/plain":[" Species Weight Length Diagonal Height Width\n","0 Bream 242.0 25.4 30.0 11.5200 4.0200\n","1 Bream 290.0 26.3 31.2 12.4800 4.3056\n","2 Bream 340.0 26.5 31.1 12.3778 4.6961\n","3 Bream 363.0 29.0 33.5 12.7300 4.4555\n","4 Bream 430.0 29.0 34.0 12.4440 5.1340"],"text/html":["\n","
\n","
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
SpeciesWeightLengthDiagonalHeightWidth
0Bream242.025.430.011.52004.0200
1Bream290.026.331.212.48004.3056
2Bream340.026.531.112.37784.6961
3Bream363.029.033.512.73004.4555
4Bream430.029.034.012.44405.1340
\n","
\n","
\n","\n","
\n"," \n","\n"," \n","\n"," \n","
\n","\n","\n","
\n"," \n","\n","\n","\n"," \n","
\n","\n","
\n","
\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"fish","summary":"{\n \"name\": \"fish\",\n \"rows\": 159,\n \"fields\": [\n {\n \"column\": \"Species\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 7,\n \"samples\": [\n \"Bream\",\n \"Roach\",\n \"Pike\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Weight\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 357.9783165508931,\n \"min\": 0.0,\n \"max\": 1650.0,\n \"num_unique_values\": 101,\n \"samples\": [\n 770.0,\n 51.5,\n 197.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Length\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 10.716328098884247,\n \"min\": 8.4,\n \"max\": 63.4,\n \"num_unique_values\": 93,\n \"samples\": [\n 14.7,\n 18.8,\n 19.6\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Diagonal\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 11.610245832690964,\n \"min\": 8.8,\n \"max\": 68.0,\n \"num_unique_values\": 124,\n \"samples\": [\n 39.2,\n 27.2,\n 23.1\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Height\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 4.286207619968867,\n \"min\": 1.7284,\n \"max\": 18.957,\n \"num_unique_values\": 154,\n \"samples\": [\n 15.438,\n 7.293,\n 2.8728\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Width\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1.6858038699921671,\n \"min\": 1.0476,\n \"max\": 8.142,\n \"num_unique_values\": 152,\n \"samples\": [\n 3.1571,\n 1.3936,\n 3.6835\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"}},"metadata":{},"execution_count":1}],"source":["import pandas as pd\n","fish = pd.read_csv('https://bit.ly/fish_csv_data') # csv 파일 데이터 직접 읽음\n","fish.head()"]},{"cell_type":"code","source":["# 어떤 종류의 생선이 있는지 unique 함수 사용하여 확인\n","print(pd.unique(fish['Species']))\n","\n","# Species 열을 타깃으로 만들고 나머지 5개 열은 입력 데이터로 사용하기 - 원하는 열을 리스트로 작성\n","fish_input = fish[['Weight', 'Length', 'Diagonal', 'Height', 'Width']].to_numpy()\n","print(fish_input[:5])"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"_TM8tyCXp_FV","executionInfo":{"status":"ok","timestamp":1728701924515,"user_tz":-540,"elapsed":3,"user":{"displayName":"조예인","userId":"17650117334011908449"}},"outputId":"8923db98-5923-4744-e842-376500cb355a"},"execution_count":3,"outputs":[{"output_type":"stream","name":"stdout","text":["['Bream' 'Roach' 'Whitefish' 'Parkki' 'Perch' 'Pike' 'Smelt']\n","[[242. 25.4 30. 11.52 4.02 ]\n"," [290. 26.3 31.2 12.48 4.3056]\n"," [340. 26.5 31.1 12.3778 4.6961]\n"," [363. 29. 33.5 12.73 4.4555]\n"," [430. 29. 34. 12.444 5.134 ]]\n"]}]},{"cell_type":"code","source":["fish_target = fish['Species'].to_numpy()\n","\n","# 머신러닝에는 기본으로 데이터 세트 2개가 필요.\n","from sklearn.model_selection import train_test_split\n","train_input, test_input, train_target, test_target = train_test_split(\n"," fish_input, fish_target, random_state=42\n",")"],"metadata":{"id":"64UeHjPGqb1s","executionInfo":{"status":"ok","timestamp":1728702009263,"user_tz":-540,"elapsed":348,"user":{"displayName":"조예인","userId":"17650117334011908449"}}},"execution_count":4,"outputs":[]},{"cell_type":"code","source":["# 훈련 세트의 통계값으로 테스트 세트 변환\n","from sklearn.preprocessing import StandardScaler\n","ss = StandardScaler()\n","ss.fit(train_input)\n","train_scaled = ss.transform(train_input)\n","test_scaled = ss.transform(test_input)"],"metadata":{"id":"-ziZlH2pq0xW","executionInfo":{"status":"ok","timestamp":1728702123270,"user_tz":-540,"elapsed":391,"user":{"displayName":"조예인","userId":"17650117334011908449"}}},"execution_count":6,"outputs":[]},{"cell_type":"markdown","source":["# k-최근접 이웃 분류기의 확률 예측"],"metadata":{"id":"G71NsKUcrTJm"}},{"cell_type":"code","source":["from sklearn.neighbors import KNeighborsClassifier\n","\n","kn = KNeighborsClassifier(n_neighbors=3)\n","kn.fit(train_scaled, train_target)\n","\n","print(kn.score(train_scaled, train_target))\n","print(kn.score(test_scaled, test_target))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"Sq6Zww_qrGys","executionInfo":{"status":"ok","timestamp":1728702171794,"user_tz":-540,"elapsed":697,"user":{"displayName":"조예인","userId":"17650117334011908449"}},"outputId":"bf30aa39-2e76-4661-a092-b4be7bbfda38"},"execution_count":7,"outputs":[{"output_type":"stream","name":"stdout","text":["0.8907563025210085\n","0.85\n"]}]},{"cell_type":"markdown","source":["타깃 데이터에 2개 이상의 클래스가 포함된 문제를 '다중 분류' 라고 부름.\n","타깃값을 그대로 사이킷런 모델에 전달하면 순서가 자동으로 알파벳 순으로 매겨짐.\n","따라서, pd.unique(fish['Species']) 로 출력했던 순서와는 상이함.\n"],"metadata":{"id":"is-rDObqrhua"}},{"cell_type":"code","source":["print(kn.classes_)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"TbyDodn_rcXy","executionInfo":{"status":"ok","timestamp":1728702260600,"user_tz":-540,"elapsed":376,"user":{"displayName":"조예인","userId":"17650117334011908449"}},"outputId":"501305d3-eb28-4974-9d8d-5a4ef816d71b"},"execution_count":8,"outputs":[{"output_type":"stream","name":"stdout","text":["['Bream' 'Parkki' 'Perch' 'Pike' 'Roach' 'Smelt' 'Whitefish']\n"]}]},{"cell_type":"code","source":["print(kn.predict(test_scaled[:5])) # 테스트 세트에 있는 처음 5개 샘플의 타깃값 예측"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"MQZ7uw1CryIX","executionInfo":{"status":"ok","timestamp":1728702286885,"user_tz":-540,"elapsed":352,"user":{"displayName":"조예인","userId":"17650117334011908449"}},"outputId":"7685f400-878c-4c4f-aa4a-86b9dab68641"},"execution_count":9,"outputs":[{"output_type":"stream","name":"stdout","text":["['Perch' 'Smelt' 'Pike' 'Perch' 'Perch']\n"]}]},{"cell_type":"markdown","source":["사이킷런 분류 모델 : predict_proba() 메서드로 클래스별 확률값을 반환.\n","numpy round() 함수는 소수점 첫째 자리에서 반올림, decimals 매개변수로 유지할 소수점 아래 자릿수를 지정할 수 있음."],"metadata":{"id":"mBd9odgBr7iK"}},{"cell_type":"code","source":["import numpy as np\n","proba = kn.predict_proba(test_scaled[:5])\n","print(np.round(proba, decimals=4)) # 소수점 네번째자리까지 표기, 다섯자리에서 반올림"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"THZRuEXMr4iX","executionInfo":{"status":"ok","timestamp":1728702445405,"user_tz":-540,"elapsed":357,"user":{"displayName":"조예인","userId":"17650117334011908449"}},"outputId":"d5d41f35-d8c4-4729-ef92-e50e72d3cc19"},"execution_count":10,"outputs":[{"output_type":"stream","name":"stdout","text":["[[0. 0. 1. 0. 0. 0. 0. ]\n"," [0. 0. 0. 0. 0. 1. 0. ]\n"," [0. 0. 0. 1. 0. 0. 0. ]\n"," [0. 0. 0.6667 0. 0.3333 0. 0. ]\n"," [0. 0. 0.6667 0. 0.3333 0. 0. ]]\n"]}]},{"cell_type":"code","source":["distances, indexes = kn.kneighbors(test_scaled[3:4]) # 슬라이싱 연산자는 하나의 배열만 선택해도 항상 2차원 배열이 생성됨.\n","print(train_target[indexes])"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"ewfitu5HsfPk","executionInfo":{"status":"ok","timestamp":1728702581773,"user_tz":-540,"elapsed":370,"user":{"displayName":"조예인","userId":"17650117334011908449"}},"outputId":"bc126346-cd00-4685-8c21-d6ab51233b2c"},"execution_count":11,"outputs":[{"output_type":"stream","name":"stdout","text":["[['Roach' 'Perch' 'Perch']]\n"]}]},{"cell_type":"markdown","source":["Roach 확률 1/3 , Perch 확률 2/3\n","그런데, 3개 최근접 이웃을 사용하니까 확률의 분모는 무조건 3인거 아닌가?"],"metadata":{"id":"dLOe8T7btfC5"}},{"cell_type":"markdown","source":["#로지스틱 회귀 : 분류 모델"],"metadata":{"id":"PpEPN6h7tot-"}},{"cell_type":"code","source":["# 확률이 아주 큰 음수일 때 0으로, 아주 큰 양수일 때 1이 되도록 하는 방법? 시그모이드 함수 또는 로지스틱 함수 사용\n","# 지수 함수 계산 : np.exp() 함수 사용\n","import numpy as np\n","import matplotlib.pyplot as plt\n","z = np.arange(-5, 5, 0.1)\n","phi = 1 / (1+np.exp(-z))\n","plt.plot(z,phi)\n","plt.xlabel('z')\n","plt.ylabel('phi')\n","plt.show"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":618},"id":"Vtb46WTPtAgw","executionInfo":{"status":"ok","timestamp":1728702949444,"user_tz":-540,"elapsed":823,"user":{"displayName":"조예인","userId":"17650117334011908449"}},"outputId":"4a55e036-89e0-4393-dc03-6ab1202c7254"},"execution_count":12,"outputs":[{"output_type":"execute_result","data":{"text/plain":[""],"text/html":["
\n","
matplotlib.pyplot.show
def show(*args, **kwargs)
/usr/local/lib/python3.10/dist-packages/matplotlib/pyplot.pyDisplay all open figures.\n","\n","Parameters\n","----------\n","block : bool, optional\n","    Whether to wait for all figures to be closed before returning.\n","\n","    If `True` block and run the GUI main loop until all figure windows\n","    are closed.\n","\n","    If `False` ensure that all figure windows are displayed and return\n","    immediately.  In this case, you are responsible for ensuring\n","    that the event loop is running to have responsive figures.\n","\n","    Defaults to True in non-interactive mode and to False in interactive\n","    mode (see `.pyplot.isinteractive`).\n","\n","See Also\n","--------\n","ion : Enable interactive mode, which shows / updates the figure after\n","      every plotting command, so that calling ``show()`` is not necessary.\n","ioff : Disable interactive mode.\n","savefig : Save the figure to an image file instead of showing it on screen.\n","\n","Notes\n","-----\n","**Saving figures to file and showing a window at the same time**\n","\n","If you want an image file as well as a user interface window, use\n","`.pyplot.savefig` before `.pyplot.show`. At the end of (a blocking)\n","``show()`` the figure is closed and thus unregistered from pyplot. Calling\n","`.pyplot.savefig` afterwards would save a new and thus empty figure. This\n","limitation of command order does not apply if the show is non-blocking or\n","if you keep a reference to the figure and use `.Figure.savefig`.\n","\n","**Auto-show in jupyter notebooks**\n","\n","The jupyter backends (activated via ``%matplotlib inline``,\n","``%matplotlib notebook``, or ``%matplotlib widget``), call ``show()`` at\n","the end of every cell by default. Thus, you usually don't have to call it\n","explicitly there.
\n"," \n","
"]},"metadata":{},"execution_count":12},{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"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\n"},"metadata":{}}]},{"cell_type":"markdown","source":["# 이진 분류 : 시그모이드 함수의 출력이 0.5보다 크면 양성 클래스, 0.5보다 작으면 음성 클래스\n","\n"],"metadata":{"id":"EP3GLClZuer_"}},{"cell_type":"code","source":["# 로지스틱 회귀로 이진 분류 수행하기 : 불리언 인덱싱\n","char_arr = np.array(['A','B','C','D','E'])\n","print(char_arr[[True, False, True, False, False]])"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"Ti63UEYBuaMP","executionInfo":{"status":"ok","timestamp":1728703057627,"user_tz":-540,"elapsed":350,"user":{"displayName":"조예인","userId":"17650117334011908449"}},"outputId":"2402a6af-d1ea-409e-b43f-b2d217d688d9"},"execution_count":13,"outputs":[{"output_type":"stream","name":"stdout","text":["['A' 'C']\n"]}]},{"cell_type":"code","source":["bream_smelt_indexes = (train_target == 'Bream') | (train_target == 'Smelt')\n","train_bream_smelt = train_scaled[bream_smelt_indexes]\n","target_bream_smelt = train_target[bream_smelt_indexes]"],"metadata":{"id":"poWeSlX2u0uG","executionInfo":{"status":"ok","timestamp":1728703162941,"user_tz":-540,"elapsed":365,"user":{"displayName":"조예인","userId":"17650117334011908449"}}},"execution_count":14,"outputs":[]},{"cell_type":"code","source":["from sklearn.linear_model import LogisticRegression\n","\n","lr = LogisticRegression()\n","lr.fit(train_bream_smelt, target_bream_smelt)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":80},"id":"0HJVY91IvObf","executionInfo":{"status":"ok","timestamp":1728703194022,"user_tz":-540,"elapsed":351,"user":{"displayName":"조예인","userId":"17650117334011908449"}},"outputId":"6b413744-b949-425a-eb78-1e5cb9ae6842"},"execution_count":15,"outputs":[{"output_type":"execute_result","data":{"text/plain":["LogisticRegression()"],"text/html":["
LogisticRegression()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
"]},"metadata":{},"execution_count":15}]},{"cell_type":"code","source":["# 훈련 모델을 사용해 train_bream_smelt 에 있는 처음 5개 샘플 예측\n","print(lr.predict(train_bream_smelt[:5])) # 두번째 샘플 제외하고 모두 도미로 예측"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"ayYednqtvWBd","executionInfo":{"status":"ok","timestamp":1728703212803,"user_tz":-540,"elapsed":367,"user":{"displayName":"조예인","userId":"17650117334011908449"}},"outputId":"2a9538fc-4d53-49b8-e102-5e50e3e0688c"},"execution_count":16,"outputs":[{"output_type":"stream","name":"stdout","text":["['Bream' 'Smelt' 'Bream' 'Bream' 'Bream']\n"]}]},{"cell_type":"code","source":["# 예측 확률은 predict_proba() 메서드에서 제공\n","print(lr.predict_proba(train_bream_smelt[:5]))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"QEVH7kHjvamE","executionInfo":{"status":"ok","timestamp":1728703247136,"user_tz":-540,"elapsed":377,"user":{"displayName":"조예인","userId":"17650117334011908449"}},"outputId":"693a7d40-0973-4879-9534-2b9560b4a336"},"execution_count":17,"outputs":[{"output_type":"stream","name":"stdout","text":["[[0.99760007 0.00239993]\n"," [0.02737325 0.97262675]\n"," [0.99486386 0.00513614]\n"," [0.98585047 0.01414953]\n"," [0.99767419 0.00232581]]\n"]}]},{"cell_type":"code","source":["# 사이킷런은 타깃값을 알파벳순으로 정렬하여 사용\n","print(lr.classes_)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"Tyu0kq0dvi-y","executionInfo":{"status":"ok","timestamp":1728703270005,"user_tz":-540,"elapsed":337,"user":{"displayName":"조예인","userId":"17650117334011908449"}},"outputId":"0665afc7-5176-40b8-a38c-2f0b2ecd1d47"},"execution_count":18,"outputs":[{"output_type":"stream","name":"stdout","text":["['Bream' 'Smelt']\n"]}]},{"cell_type":"code","source":["print(lr.coef_, lr.intercept_)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"5sU4Pu2ovokr","executionInfo":{"status":"ok","timestamp":1728703280273,"user_tz":-540,"elapsed":359,"user":{"displayName":"조예인","userId":"17650117334011908449"}},"outputId":"9b8503d1-2239-4c09-8fa6-f2d9b16e11b9"},"execution_count":19,"outputs":[{"output_type":"stream","name":"stdout","text":["[[-0.40451732 -0.57582787 -0.66248158 -1.01329614 -0.73123131]] [-2.16172774]\n"]}]},{"cell_type":"code","source":["# LogisticRegression 모델로 z 값을 계산할 수 있을까?\n","# LogisticRegression 클래스는 decision_function() 메서드로 z 값 출력 가능\n","decisions = lr.decision_function(train_bream_smelt[:5])\n","print(decisions)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"uMYw5X9kvrEr","executionInfo":{"status":"ok","timestamp":1728703333064,"user_tz":-540,"elapsed":366,"user":{"displayName":"조예인","userId":"17650117334011908449"}},"outputId":"8dca1331-c965-4874-b9fb-3747a37bb96e"},"execution_count":20,"outputs":[{"output_type":"stream","name":"stdout","text":["[-6.02991358 3.57043428 -5.26630496 -4.24382314 -6.06135688]\n"]}]},{"cell_type":"code","source":["# z 값을 시그모이드 함수에 통과, 확률 얻을 수 있음. expit() 사용.\n","from scipy.special import expit\n","print(expit(decisions))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"70ltNxgUv39W","executionInfo":{"status":"ok","timestamp":1728703380595,"user_tz":-540,"elapsed":366,"user":{"displayName":"조예인","userId":"17650117334011908449"}},"outputId":"325e0670-3d68-4b01-82a6-8ba1edd0f2c0"},"execution_count":21,"outputs":[{"output_type":"stream","name":"stdout","text":["[0.00239993 0.97262675 0.00513614 0.01414953 0.00232581]\n"]}]},{"cell_type":"markdown","source":["# 로지스틱 회귀로 다중 분류"],"metadata":{"id":"9JfK9AT-wG8d"}},{"cell_type":"code","source":["# LogisticRegression 클래스 : 반복적인 알고리즘 사용, 기본값은 100.\n","# 릿지 회귀와 같이 계수의 제곱을 규제.(L2 규제)\n","# 릿지 회귀 : alpha 매개변수로 규제 양 조잘 / LogisticRegression 클래스 : C는 alpha 와 반대로 작을수록 규제가 커짐.\n","lr = LogisticRegression(C=20, max_iter=1000)\n","lr.fit(train_scaled, train_target)\n","\n","print(lr.score(train_scaled, train_target))\n","print(lr.score(test_scaled, test_target))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"KxbgkEPuwDkF","executionInfo":{"status":"ok","timestamp":1728703493745,"user_tz":-540,"elapsed":346,"user":{"displayName":"조예인","userId":"17650117334011908449"}},"outputId":"8d38cb2d-7d71-415e-8ccd-0a3b79bedea6"},"execution_count":22,"outputs":[{"output_type":"stream","name":"stdout","text":["0.9327731092436975\n","0.925\n"]}]},{"cell_type":"code","source":["print(lr.predict(test_scaled[:5]))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"r095vMgPwfL8","executionInfo":{"status":"ok","timestamp":1728703499390,"user_tz":-540,"elapsed":349,"user":{"displayName":"조예인","userId":"17650117334011908449"}},"outputId":"b34798af-047e-4a7e-db90-4c78ebf141b1"},"execution_count":23,"outputs":[{"output_type":"stream","name":"stdout","text":["['Perch' 'Smelt' 'Pike' 'Roach' 'Perch']\n"]}]},{"cell_type":"code","source":["proba = lr.predict_proba(test_scaled[:5])\n","print(np.round(proba, decimals=3))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"hZeRndCWwgkm","executionInfo":{"status":"ok","timestamp":1728703507145,"user_tz":-540,"elapsed":336,"user":{"displayName":"조예인","userId":"17650117334011908449"}},"outputId":"c1246a6c-7c59-4575-8c88-b026226e403d"},"execution_count":24,"outputs":[{"output_type":"stream","name":"stdout","text":["[[0. 0.014 0.842 0. 0.135 0.007 0.003]\n"," [0. 0.003 0.044 0. 0.007 0.946 0. ]\n"," [0. 0. 0.034 0.934 0.015 0.016 0. ]\n"," [0.011 0.034 0.305 0.006 0.567 0. 0.076]\n"," [0. 0. 0.904 0.002 0.089 0.002 0.001]]\n"]}]},{"cell_type":"code","source":["print(lr.classes_)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"3X5JvetdwieC","executionInfo":{"status":"ok","timestamp":1728703518118,"user_tz":-540,"elapsed":374,"user":{"displayName":"조예인","userId":"17650117334011908449"}},"outputId":"bdcb183d-1ab9-42db-d04f-66df9ad0eff5"},"execution_count":25,"outputs":[{"output_type":"stream","name":"stdout","text":["['Bream' 'Parkki' 'Perch' 'Pike' 'Roach' 'Smelt' 'Whitefish']\n"]}]},{"cell_type":"code","source":["print(lr.coef_.shape, lr.intercept_.shape) # 다중 분류는 클래스마다 z 값을 하나씩 계산. 다중분류는 '소프트맥스(지수함수)함수' 사용."],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"yUnBgGEPwlI-","executionInfo":{"status":"ok","timestamp":1728703527751,"user_tz":-540,"elapsed":353,"user":{"displayName":"조예인","userId":"17650117334011908449"}},"outputId":"e4524c6a-0bb5-4714-ee7e-1c15187a7915"},"execution_count":26,"outputs":[{"output_type":"stream","name":"stdout","text":["(7, 5) (7,)\n"]}]},{"cell_type":"code","source":["decision = lr.decision_function(test_scaled[:5])\n","print(np.round(decision, decimals=2))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"V6CG-egHwnf7","executionInfo":{"status":"ok","timestamp":1728703616211,"user_tz":-540,"elapsed":369,"user":{"displayName":"조예인","userId":"17650117334011908449"}},"outputId":"c67ed2a8-8473-4bf7-842d-02146ea6cc4a"},"execution_count":27,"outputs":[{"output_type":"stream","name":"stdout","text":["[[ -6.51 1.04 5.17 -2.76 3.34 0.35 -0.63]\n"," [-10.88 1.94 4.78 -2.42 2.99 7.84 -4.25]\n"," [ -4.34 -6.24 3.17 6.48 2.36 2.43 -3.87]\n"," [ -0.69 0.45 2.64 -1.21 3.26 -5.7 1.26]\n"," [ -6.4 -1.99 5.82 -0.13 3.5 -0.09 -0.7 ]]\n"]}]},{"cell_type":"code","source":["from scipy.special import softmax\n","\n","proba = softmax(decision, axis=1)\n","print(np.round(proba, decimals=3))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"qaqT69Fnw9FY","executionInfo":{"status":"ok","timestamp":1728703623216,"user_tz":-540,"elapsed":358,"user":{"displayName":"조예인","userId":"17650117334011908449"}},"outputId":"80fe8443-3dca-455f-a37b-33145cbb2cea"},"execution_count":28,"outputs":[{"output_type":"stream","name":"stdout","text":["[[0. 0.014 0.842 0. 0.135 0.007 0.003]\n"," [0. 0.003 0.044 0. 0.007 0.946 0. ]\n"," [0. 0. 0.034 0.934 0.015 0.016 0. ]\n"," [0.011 0.034 0.305 0.006 0.567 0. 0.076]\n"," [0. 0. 0.904 0.002 0.089 0.002 0.001]]\n"]}]},{"cell_type":"code","source":[],"metadata":{"id":"72KulIJcw-zg"},"execution_count":null,"outputs":[]}]} \ No newline at end of file diff --git "a/week3/[MLNovice]\354\241\260\354\230\210\354\235\270_week3-2.ipynb" "b/week3/[MLNovice]\354\241\260\354\230\210\354\235\270_week3-2.ipynb" new file mode 100644 index 0000000..76f5069 --- /dev/null +++ "b/week3/[MLNovice]\354\241\260\354\230\210\354\235\270_week3-2.ipynb" @@ -0,0 +1 @@ +{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"provenance":[],"authorship_tag":"ABX9TyPXPrs6PEHOmUsQMSXiu0IJ"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"markdown","source":["# 확률적 경사 하강법"],"metadata":{"id":"Yc7U3Xu7xPqE"}},{"cell_type":"markdown","source":["점진적 학습 알고리즘 : 확률적 경사 하강법"],"metadata":{"id":"aM5c35DgxYa7"}},{"cell_type":"code","execution_count":null,"metadata":{"id":"bhaTxmXzxNHx"},"outputs":[],"source":["# 확률적 경사 하강법에서 훈련 세트를 한 번 모두 사용하는 과정 : 에포크 라고 함.\n","# 여러개의 샘플을 사용해 경사하강법 수행하는 방식 : 미니배치 경사하강법 이라고 함.\n","# 한 번 경사로를 따라 이동하기 위해 전체 샘플 사용 : 배치 경사하강법 이라고 함."]},{"cell_type":"markdown","source":["가장 빠른 길을 찾는 과정 : 손실함수\n","손실 함수 : 머신러닝이 얼마나 엉터리인지 측정하는 기준. 즉, 손실함수 값이 작을수록 좋음"],"metadata":{"id":"eUhaI0hrxw1X"}},{"cell_type":"markdown","source":["# 로지스틱 손실 함수\n","\n","\n","\n","1. 양성 클래스 (타킷=1) 일 때 손실은 -log(예측 확률) 로 계산 :\n","확률은 1에서 멀어져 0에 가까워질수록 손실은 아주 큰 양수가 됨.\n","\n","2. 음성 클래스 (타깃=0) 일 때 손실은 -log(1-예측 확률)로 계산 :\n","확률이 0에서 멀어져 1에 가까워질수록 손실은 아주 큰 야웃가 됨\n","\n","\n"],"metadata":{"id":"p1lmIQN0x-Ub"}},{"cell_type":"markdown","source":["이진 분류 : 로지스틱 손실 함수 사용\n","다중 분류 : 크로스엔트로피 손실 함수 사용"],"metadata":{"id":"qqBMM8lnyfZ2"}},{"cell_type":"markdown","source":["# SGDClassifier"],"metadata":{"id":"Ig_iO--JymYc"}},{"cell_type":"code","source":["import pandas as pd\n","fish = pd.read_csv('https://bit.ly/fish_csv_data')"],"metadata":{"id":"G3XclUNhybPu","executionInfo":{"status":"ok","timestamp":1728704095807,"user_tz":-540,"elapsed":1707,"user":{"displayName":"조예인","userId":"17650117334011908449"}}},"execution_count":1,"outputs":[]},{"cell_type":"code","source":["fish_input = fish[['Weight','Length','Diagonal','Height','Width']].to_numpy()\n","fish_target = fish['Species'].to_numpy()"],"metadata":{"id":"k499vL20ywDl","executionInfo":{"status":"ok","timestamp":1728704163731,"user_tz":-540,"elapsed":354,"user":{"displayName":"조예인","userId":"17650117334011908449"}}},"execution_count":3,"outputs":[]},{"cell_type":"code","source":["# 사이킷런 train_test_split() 함수 사용해 훈련세트, 테스트 세트 나눔\n","from sklearn.model_selection import train_test_split\n","\n","train_input, test_input, train_target, test_target = train_test_split(\n"," fish_input, fish_target, random_state=42)"],"metadata":{"id":"cgLPmX_5y7oX","executionInfo":{"status":"ok","timestamp":1728704196506,"user_tz":-540,"elapsed":2421,"user":{"displayName":"조예인","userId":"17650117334011908449"}}},"execution_count":4,"outputs":[]},{"cell_type":"code","source":["# 훈련 세트에서 학습한 통계 값으로 테스트 세트도 변환\n","from sklearn.preprocessing import StandardScaler\n","\n","ss = StandardScaler()\n","ss.fit(train_input)\n","train_scaled = ss.transform(train_input)\n","test_scaled = ss.transform(test_input)"],"metadata":{"id":"hH3gNxEPzKQM","executionInfo":{"status":"ok","timestamp":1728704207114,"user_tz":-540,"elapsed":355,"user":{"displayName":"조예인","userId":"17650117334011908449"}}},"execution_count":5,"outputs":[]},{"cell_type":"code","source":["# 사이킷런에서 확률적 경사하강법 제공하는 분류용 클래스 : SGDClassifier\n","from sklearn.linear_model import SGDClassifier\n","\n","sc = SGDClassifier(loss='log_loss', max_iter=10, random_state=42) # 전체 훈련 세트 10회 반복\n","sc.fit(train_scaled, train_target)\n","\n","print(sc.score(train_scaled, train_target))\n","print(sc.score(test_scaled, test_target))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"vzRaU9iSzNWt","executionInfo":{"status":"ok","timestamp":1728704245146,"user_tz":-540,"elapsed":385,"user":{"displayName":"조예인","userId":"17650117334011908449"}},"outputId":"ac6c9816-70b8-4ac4-d4eb-c45991b3463e"},"execution_count":6,"outputs":[{"output_type":"stream","name":"stdout","text":["0.773109243697479\n","0.775\n"]},{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_stochastic_gradient.py:744: ConvergenceWarning: Maximum number of iteration reached before convergence. Consider increasing max_iter to improve the fit.\n"," warnings.warn(\n"]}]},{"cell_type":"code","source":["# 모델을 이어서 훈련할 때에는 partial_fit() 메서드 사용 : fit() 메서드와 사용법 같지만, 호출할 때마다 1 에포크씩 이어서 훈련 가능\n","sc.partial_fit(train_scaled, train_target)\n","print(sc.score(train_scaled, train_target))\n","print(sc.score(test_scaled, test_target))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"Ipb-aLorzWn_","executionInfo":{"status":"ok","timestamp":1728704319761,"user_tz":-540,"elapsed":363,"user":{"displayName":"조예인","userId":"17650117334011908449"}},"outputId":"fd52f08e-6486-4fba-cf0b-ff20393a3706"},"execution_count":7,"outputs":[{"output_type":"stream","name":"stdout","text":["0.8151260504201681\n","0.85\n"]}]},{"cell_type":"code","source":["sc.partial_fit(train_scaled, train_target)\n","\n","print(sc.score(train_scaled, train_target))\n","print(sc.score(test_scaled, test_target))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"Y2UcXKHfzoza","executionInfo":{"status":"ok","timestamp":1728704336196,"user_tz":-540,"elapsed":349,"user":{"displayName":"조예인","userId":"17650117334011908449"}},"outputId":"9f3df98c-e47b-4159-9b1d-36b81c1ac9ac"},"execution_count":8,"outputs":[{"output_type":"stream","name":"stdout","text":["0.7815126050420168\n","0.8\n"]}]},{"cell_type":"markdown","source":["# 에포크와 과대/과소 적합"],"metadata":{"id":"SCcnZfy9z08F"}},{"cell_type":"code","source":["# 과대 적합이 시작하기 전에 훈련을 멈추는 것 : 조기 종료\n","# fit() 메서드 대신 partial_fit() 메서드 사용\n","\n","import numpy as np\n","sc = SGDClassifier(loss='log_loss', random_state=42)\n","train_score = []\n","test_score = []\n","classes = np.unique(train_target)"],"metadata":{"id":"w2Kufp_xzs3w","executionInfo":{"status":"ok","timestamp":1728704450887,"user_tz":-540,"elapsed":381,"user":{"displayName":"조예인","userId":"17650117334011908449"}}},"execution_count":9,"outputs":[]},{"cell_type":"code","source":["# for 문 사용하여 300번 에포크 동안 훈련 반복\n","for _ in range(0, 300):\n"," sc.partial_fit(train_scaled, train_target, classes=classes)\n","\n"," train_score.append(sc.score(train_scaled, train_target))\n"," test_score.append(sc.score(test_scaled, test_target))"],"metadata":{"id":"vEe-6cv70I3G","executionInfo":{"status":"ok","timestamp":1728704479204,"user_tz":-540,"elapsed":3255,"user":{"displayName":"조예인","userId":"17650117334011908449"}}},"execution_count":10,"outputs":[]},{"cell_type":"code","source":["import matplotlib.pyplot as plt\n","\n","plt.plot(train_score)\n","plt.plot(test_score)\n","plt.xlabel('epoch')\n","plt.ylabel('accuracy')\n","plt.show() # 100 번째 이후에는 점수가 벌어지는 경향."],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":449},"id":"eVjbv9yp0PEt","executionInfo":{"status":"ok","timestamp":1728704483891,"user_tz":-540,"elapsed":800,"user":{"displayName":"조예인","userId":"17650117334011908449"}},"outputId":"0c97edeb-f494-4b76-d71e-9b9ef8c15ab9"},"execution_count":11,"outputs":[{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"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F1wQeY1U2V4zZ840S5cuNdu2bTOfffaZmTlzpnG5XObtt982xiTW94pwY5Pf/OY3pmfPnsbr9ZoRI0aYf/3rX06XlBAmTJhg8vPzjdfrNQUFBWbChAlmy5YtkcePHDlibrvtNtOhQweTlZVlrrzySrNnzx4HK46f9957z0hq8DNx4kRjTOhw8NmzZ5u8vDzj8/nM6NGjzaZNm6Je48CBA+b66683bdu2NdnZ2WbSpEmmvLzcgU/Tso63rSorK83FF19sOnfubNLT002vXr3M5MmTG/zjIlW2VWPbSZL53//938g6Tfm7++qrr8wll1xiMjMzTW5urrn99tuN3++P86dpeSfaXjt27DAXXHCB6dixo/H5fKZfv37mjjvuMKWlpVGvkwrb6wc/+IHp1auX8Xq9pnPnzmb06NGRYGNMYn2vXMYYY28vCAAAwDnMuQEAAEmFcAMAAJIK4QYAACQVwg0AAEgqhBsAAJBUCDcAACCpEG4AAEBSIdwAAICkQrgBkPKWLFkil8vV4KJ/AFonwg0AAEgqhBsAAJBUCDcAHGdZloqKitSnTx9lZmZq8ODBWrBggaS6IaM33nhDgwYNUkZGhr7xjW9o7dq1Ua/xl7/8RWeddZZ8Pp969+6tRx99NOrx6upq3XXXXerRo4d8Pp/69eunZ555JmqdVatWadiwYcrKytK5556rTZs2tewHB9AiCDcAHFdUVKTnnntOc+fO1bp16zR9+nR997vf1dKlSyPr3HHHHXr00Uf18ccfq3Pnzrrsssvk9/slhULJtddeq+uuu06ff/65fvrTn2r27Nl69tlnI8+/6aab9MILL+jXv/61NmzYoN/97ndq27ZtVB333HOPHn30Ua1cuVJpaWn6wQ9+EJfPD8BeXBUcgKOqq6vVsWNHvfPOOyosLIws/+EPf6jKykrdfPPN+ta3vqUXX3xREyZMkCQdPHhQ3bt317PPPqtrr71WN954o/bt26e333478vw777xTb7zxhtatW6cvvvhC/fv316JFizRmzJgGNSxZskTf+ta39M4772j06NGSpDfffFPjx4/XkSNHlJGR0cJbAYCd6NwAcNSWLVtUWVmpb3/722rbtm3k57nnntPWrVsj69UPPh07dlT//v21YcMGSdKGDRt03nnnRb3ueeedp82bNysYDGrNmjXyeDy68MILj1vLoEGDIrfz8/MlSXv37m32ZwQQX2lOFwAgtR0+fFiS9MYbb6igoCDqMZ/PFxVwYpWZmdmk9dLT0yO3XS6XpNB8IACtC50bAI4688wz5fP5tGPHDvXr1y/qp0ePHpH1/vWvf0Vuf/311/riiy90xhlnSJLOOOMMffjhh1Gv++GHH+q0006Tx+PRwIEDZVlW1BweAMmLzg0AR7Vr104/+clPNH36dFmWpVGjRqm0tFQffvihsrOz1atXL0nSAw88oE6dOikvL0/33HOPcnNzdcUVV0iSbr/9dg0fPlwPPvigJkyYoGXLlumJJ57Qb3/7W0lS7969NXHiRP3gBz/Qr3/9aw0ePFjbt2/X3r17de211zr10QG0EMINAMc9+OCD6ty5s4qKivTll18qJydH55xzju6+++7IsNDDDz+sadOmafPmzRoyZIhef/11eb1eSdI555yjl156Sffdd58efPBB5efn64EHHtD3v//9yHs89dRTuvvuu3XbbbfpwIED6tmzp+6++24nPi6AFsbRUgASWvhIpq+//lo5OTlOlwOgFWDODQAASCqEGwAAkFQYlgIAAEmFzg0AAEgqhBsAAJBUCDcAACCpEG4AAEBSIdwAAICkQrgBAABJhXADAACSCuEGAAAklf8fYN/DvmrpaMcAAAAASUVORK5CYII=\n"},"metadata":{}}]},{"cell_type":"code","source":["sc = SGDClassifier(loss='log_loss', max_iter=100, tol=None, random_state=42)\n","sc.fit(train_scaled, train_target)\n","\n","print(sc.score(train_scaled, train_target))\n","print(sc.score(test_scaled, test_target))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"QnYaijuL0Q0Q","executionInfo":{"status":"ok","timestamp":1728704515356,"user_tz":-540,"elapsed":365,"user":{"displayName":"조예인","userId":"17650117334011908449"}},"outputId":"11ae6dce-e1b5-42ef-d313-822b1dd306b5"},"execution_count":12,"outputs":[{"output_type":"stream","name":"stdout","text":["0.957983193277311\n","0.925\n"]}]},{"cell_type":"code","source":["# 힌지 손실\n","sc = SGDClassifier(loss='hinge', max_iter=100, tol=None, random_state=42)\n","sc.fit(train_scaled, train_target)\n","\n","print(sc.score(train_scaled, train_target))\n","print(sc.score(test_scaled, test_target))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"OUDu-8XE0Ymu","executionInfo":{"status":"ok","timestamp":1728704520425,"user_tz":-540,"elapsed":342,"user":{"displayName":"조예인","userId":"17650117334011908449"}},"outputId":"a7a8de04-6360-4e20-85f4-3b3cbf0c738e"},"execution_count":13,"outputs":[{"output_type":"stream","name":"stdout","text":["0.9495798319327731\n","0.925\n"]}]},{"cell_type":"code","source":[],"metadata":{"id":"nBF9hbKg0Z2W"},"execution_count":null,"outputs":[]}]} \ No newline at end of file diff --git "a/week3/[MLNovice]\354\241\260\354\230\210\354\235\270_week3.pdf" "b/week3/[MLNovice]\354\241\260\354\230\210\354\235\270_week3.pdf" new file mode 100644 index 0000000..2ed3db8 Binary files /dev/null and "b/week3/[MLNovice]\354\241\260\354\230\210\354\235\270_week3.pdf" differ