<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>m1ng_9.log</title>
        <link>https://velog.io/</link>
        <description>XD</description>
        <lastBuildDate>Mon, 18 Dec 2023 13:22:35 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. m1ng_9.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/m1ng_9" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[12.11 머신러닝]]></title>
            <link>https://velog.io/@m1ng_9/12.11-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D</link>
            <guid>https://velog.io/@m1ng_9/12.11-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D</guid>
            <pubDate>Mon, 18 Dec 2023 13:22:35 GMT</pubDate>
            <description><![CDATA[<h1 id="머신러닝">머신러닝</h1>
]]></description>
        </item>
        <item>
            <title><![CDATA[12.08 비지도학습]]></title>
            <link>https://velog.io/@m1ng_9/12.08-%EB%B9%84%EC%A7%80%EB%8F%84%ED%95%99%EC%8A%B5</link>
            <guid>https://velog.io/@m1ng_9/12.08-%EB%B9%84%EC%A7%80%EB%8F%84%ED%95%99%EC%8A%B5</guid>
            <pubDate>Thu, 14 Dec 2023 14:26:40 GMT</pubDate>
            <description><![CDATA[<h1 id="비지도학습">비지도학습</h1>
]]></description>
        </item>
        <item>
            <title><![CDATA[12.07 비지도학습]]></title>
            <link>https://velog.io/@m1ng_9/12.07-%EB%B9%84%EC%A7%80%EB%8F%84%ED%95%99%EC%8A%B5</link>
            <guid>https://velog.io/@m1ng_9/12.07-%EB%B9%84%EC%A7%80%EB%8F%84%ED%95%99%EC%8A%B5</guid>
            <pubDate>Wed, 13 Dec 2023 12:21:36 GMT</pubDate>
            <description><![CDATA[<p>비지도학습</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[12.06 로지스틱 회귀 - 분류]]></title>
            <link>https://velog.io/@m1ng_9/12.06-%EB%B6%84%EB%A5%98</link>
            <guid>https://velog.io/@m1ng_9/12.06-%EB%B6%84%EB%A5%98</guid>
            <pubDate>Tue, 12 Dec 2023 12:37:29 GMT</pubDate>
            <description><![CDATA[<h1 id="분류">분류</h1>
<ol>
<li>이진분류(binary classification)</li>
<li>다중분류(multinomial classification)
<img src="https://velog.velcdn.com/images/m1ng_9/post/7ed7c106-ead0-44be-8c0b-fef5615439df/image.png" alt=""></li>
</ol>
<ul>
<li>위의 그림처럼 독립변수 1개인 직선을 그려 이중으로 분류를 할 수 있다.</li>
<li>이진분류를 확장하여 다중분류를 실행할 수 있다.</li>
<li>Logistic Regression으로 예를 들어 구현해보자.
<img src="https://velog.velcdn.com/images/m1ng_9/post/e1b51444-8885-40ad-9da7-3111070b0e1a/image.png" alt=""></li>
<li>위의 예는 성적, 출석, 학점이 있는 데이터이다.</li>
<li>빨간선은 hyperplane으로 초평면을 말합니다.</li>
<li>초평면은 P차원 공간속에서 평면을 일반화하여 P-1차원으로 보는 부분공간입니다.</li>
<li>파란선과 보라선 성적과 출석에 대한 선형 회귀선입니다.</li>
<li>우리가 알고싶어하는 점은 성적은 C보다는 높고, B와는 비슷하고, A보다는 낮습니다. 출석은 C와는 비슷하고 B보다는 출석률이 높고, A보다는 낮습니다.</li>
<li>이때 우리 목표는 검은점이 받을 성적은 무엇인가를 예측하는 것입니다.
<img src="https://velog.velcdn.com/images/m1ng_9/post/65c427ab-4ac6-49d3-ae52-d0cba8cb5670/image.png" alt=""></li>
<li>위의 식은 기존 이진분류에서 다중분류로 넘어와서 독립변수 한개가 추가 되어 생성된 식입니다.
<img src="https://velog.velcdn.com/images/m1ng_9/post/1fd58b9a-3731-438e-8b82-3736b20714e4/image.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[12.05 로지스틱 회귀 예제]]></title>
            <link>https://velog.io/@m1ng_9/12.05-%EB%A1%9C%EC%A7%80%EC%8A%A4%ED%8B%B1-%ED%9A%8C%EA%B7%80</link>
            <guid>https://velog.io/@m1ng_9/12.05-%EB%A1%9C%EC%A7%80%EC%8A%A4%ED%8B%B1-%ED%9A%8C%EA%B7%80</guid>
            <pubDate>Mon, 11 Dec 2023 13:51:31 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/m1ng_9/post/063b24ce-6f6d-41dd-83e6-dd49249ea5aa/image.png" alt=""></p>
<h1 id="로지스틱-회귀-실습">로지스틱 회귀 실습</h1>
<p><img src="https://velog.velcdn.com/images/m1ng_9/post/20a9c1ef-ccd8-4e9f-956d-db4627051f9c/image.png" alt=""></p>
<ul>
<li>kaggle을 이용한다.<h2 id="유방암-데이터로-실습하기">유방암 데이터로 실습하기</h2>
<h3 id="1-필요한-module-import">1. 필요한 module import</h3>
<pre><code class="language-python">import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
from sklearn import linear_model
from sklearn.model_selection import cross_val_score
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Flatten, Dense
from tensorflow.keras.optimizers import Adam</code></pre>
</li>
</ul>
<h3 id="2-데이터-로드-및-전처리">2. 데이터 로드 및 전처리</h3>
<pre><code class="language-python"># Imbalanced Data Problem을 해결해 보아요!
# SMOTE 알고리즘을 이용해 보아요!

# 불균형한 데이터가 있어야 해요!
# 유방암 예측 데이터셋으로 해 보아요!

# Raw Data Loading
cancer = load_breast_cancer()
# x_data(feature), t_data(0, 1), 데이터의 설명, .....

# x_data =&gt; cancer.data
# t_data =&gt; cancer.target

print(cancer.data.shape, cancer.target.shape)
# (569, 30) =&gt; x_data는 총 569개의 행으로 구성, 컬럼(feature)은 30개
# (569,) =&gt; t_data 역시 총 569개 있어요. 0과 1로 구성되어 있어요!

print(np.unique(cancer.target, return_counts=True))
# (array([0, 1]), array([212, 357]))
#                        0.37, 0.63
# 0은 악성종양(나쁜거), 1은 양성종양(괜찮은거)
# 약간의 데이터 불균형이 존재.(imbalanced data)

# 데이터셋 저장
x_data = cancer.data
t_data = cancer.target

# boxplot을 이용해서 이상치와 데이터 분포를 간단하게 확인!
# plt.boxplot(x_data)
# plt.show()

# 데이터 정규화가 필요해요!
# 원래 정규화는 당연히 이상치를 제거하고 진행하는게 맞아요!
# 실제적인 이상치는 존재하지 않는다고 가정하고 진행!
scaler = MinMaxScaler()
scaler.fit(x_data)
x_data_norm = scaler.transform(x_data)

# 데이터를 분리해야 해요! 학습용과 평가용으로 분리
# train data와 test data로 분리(데이터를 섞어서 분리)
x_data_train_norm, x_data_test_norm, t_data_train, t_data_test = \
train_test_split(x_data_norm,
                 t_data,
                 stratify=t_data,
                 test_size=0.2,   # default값은 0.25
                 random_state=3)

# 섞어서 분리했기 때문에 데이터의 편향이 없을거라 생각되는데
# 확인은 해야 겠죠.
np.unique(t_data_test, return_counts=True )
# (array([0, 1]), array([42, 75]))  # 35% , 65%</code></pre>
<h3 id="3-sklearn-tensorflow-구현">3. sklearn, Tensorflow 구현</h3>
<h4 id="sklearn">sklearn</h4>
<pre><code class="language-python"># sklearn model 구현

sklearn_model = linear_model.LogisticRegression()

# 학습하기 전에 cross validation을 한번 수행해 볼꺼예요!
# train data를 가지고 수행해요!
score = cross_val_score(sklearn_model,
                        x_data_train_norm,
                        t_data_train,
                        cv=5)
print(score)
# [0.97802198 0.94505495 0.95604396 0.98901099 0.94505495]

print(f&#39;sklearn의 평균 validation accuracy : {np.mean(score)}&#39;)
# 0.9626373626373625

# 학습진행
sklearn_model.fit(x_data_train_norm,
                  t_data_train)

# 모델최종평가
test_score = sklearn_model.score(x_data_test_norm,
                                 t_data_test)
print(f&#39;모델의 최종 score : {test_score}&#39;)  # 0.9649</code></pre>
<h4 id="tensorflow">Tensorflow</h4>
<pre><code class="language-python"># Tensorflow 구현

keras_model = Sequential()

keras_model.add(Flatten(input_shape=(30,)))
keras_model.add(Dense(units=1,
                      activation=&#39;sigmoid&#39;))

# 학습할 때 매 epoch마다 validation을 수행하고
# validation의 평가 기준은 accuracy를 사용하겠어요!
keras_model.compile(optimizer=Adam(learning_rate=1e-1),
                    loss=&#39;binary_crossentropy&#39;,
                    metrics=[&#39;acc&#39;])

keras_model.fit(x_data_train_norm,
                t_data_train,
                epochs=300,
                verbose=1,
                validation_split=0.2)

# Epoch 300/300
# 12/12 [==============================] - 0s 6ms/step 
# - loss: 0.0437 - acc: 0.9890 - val_loss: 0.1034 - val_acc: 0.9560
# training data로 학습한 후
# training data로 평가 vs. validation data로 평가

# loss : training data로 학습한 후 training data를 이용해서 계산한 loss
# val_loss : validation data로 계산한 loss

# 학습이 다 끝났어요!
# Evaluation(평가)
result = keras_model.evaluate(x_data_test_norm,
                              t_data_test)
print(result)
#       loss값             accuracy값
# [0.1397516131401062, 0.9649122953414917]
</code></pre>
<h2 id="타이타닉-데이터">타이타닉 데이터</h2>
<h3 id="1-필요한-module-import-1">1. 필요한 module import</h3>
<pre><code class="language-python"># Titanic data를 이용한 Logistic Regression 구현
# Kaggle에 있는 데이터를 이용.
# Kaggle에 있는 데이터를 전처리 한 후
# 모델을 만들어서 학습을 진행
# 자체 평가를 진행(validation)
# 모델을 이용해서 예측값을 추출(test.csv)
# 예측된 결과를 kaggle에 upload해서 우리 모델의 성능을 검증.

import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Flatten, Dense
from tensorflow.keras.optimizers import Adam</code></pre>
<h3 id="2-데이터-로드-및-전처리-1">2. 데이터 로드 및 전처리</h3>
<pre><code class="language-python"># Raw Data Loading
df = pd.read_csv(&#39;/content/drive/MyDrive/Colab Notebooks/ML/data/titanic/train.csv&#39;)

# display(df)  # 891 rows × 12 columns

# 데이터 전처리!(feature engineering)
train = df

# 사용하는 coulmn만 추출. 사용되지 않는(불필요한) column을 삭제
# print(train.columns)
# 필요없는 컬럼은(종속변수에 영향을 주지 않거나 의미상 중복 컬럼)
train.drop([&#39;PassengerId&#39;, &#39;Ticket&#39;, &#39;Name&#39;, &#39;Fare&#39;, &#39;Cabin&#39;],
           axis=1,
           inplace=True)
# display(df)

# 성별처리 (male:0, female:1)
gender_mapping = {&#39;male&#39;: 0,
                  &#39;female&#39;: 1}
train[&#39;Sex&#39;] = train[&#39;Sex&#39;].map(gender_mapping)


train[&#39;Family&#39;] = train[&#39;SibSp&#39;] + train[&#39;Parch&#39;]

train.drop([&#39;SibSp&#39;, &#39;Parch&#39;],
           axis=1,
           inplace=True)
# df.info()

# Embarked의 결측치를 처리해 보아요!
train[&#39;Embarked&#39;] = train[&#39;Embarked&#39;].fillna(&#39;Q&#39;)

# Embarked 처리
Embarked_mapping = {&#39;S&#39;: 0,
                    &#39;C&#39;: 1,
                    &#39;Q&#39;: 2}
train[&#39;Embarked&#39;] = train[&#39;Embarked&#39;].map(Embarked_mapping)

# 나이를 처리해야 해요! 나이에는 결측치가 많아요!
train[&#39;Age&#39;] = train[&#39;Age&#39;].fillna(train[&#39;Age&#39;].mean())

# 나이에 대해서는....Binning 처리를 해요!
train.loc[train[&#39;Age&#39;] &lt; 8, &#39;Age&#39;] = 0
train.loc[(train[&#39;Age&#39;] &gt;= 8) &amp; (train[&#39;Age&#39;] &lt; 20), &#39;Age&#39;] = 1
train.loc[(train[&#39;Age&#39;] &gt;= 20) &amp; (train[&#39;Age&#39;] &lt; 65), &#39;Age&#39;] = 2
train.loc[train[&#39;Age&#39;] &gt;= 65, &#39;Age&#39;] = 3

x_data = train.drop(&#39;Survived&#39;, axis=1, inplace=False).values
t_data = train[&#39;Survived&#39;].values.reshape(-1,1)

# 정규화!
scaler = MinMaxScaler()
scaler.fit(x_data)

x_data_norm = scaler.transform(x_data)

# train데이터와 test데이터를 분리하나요?
# 원래 내가 만든 모델의 최종 평가를 하기 위해서는 test데이터가 당연히 있어야 해요!
# 하지만 우리예제는 kaggle에서 제공한 test데이터를 이용한 예측결과값을
# 파일로 만들어서 kaggle에 제출하는 것이기 때문에 test 데이터가 필요 없어요!</code></pre>
<h3 id="3-모델-학습">3. 모델 학습</h3>
<pre><code class="language-python"># Keras Model을 만들어 보아요!

keras_model = Sequential()

keras_model.add(Flatten(input_shape=(5,)))
keras_model.add(Dense(units=1,
                      activation=&#39;sigmoid&#39;))

keras_model.compile(optimizer=Adam(learning_rate=1e-2),
                    loss=&#39;binary_crossentropy&#39;,
                    metrics=[&#39;acc&#39;])

keras_model.fit(x_data_norm,
                t_data,
                epochs=300,
                verbose=1,
                validation_split=0.2)

# loss: 0.4550 - acc: 0.7992 - val_loss: 0.3913 - val_acc: 0.8212</code></pre>
<h3 id="4-kaggle에-제출할-파일-생성하기">4. kaggle에 제출할 파일 생성하기</h3>
<pre><code class="language-python"># 학습이 끝났으니... 제출파일을 생성해야 해요!
# 모델이 만들어 졌으니 test 데이터로 예측된 결과를 csv파일로
# 만들어서 kaggle에 제출하고 그 결과를 확인해보아요!

# 어떻게 해야 할까요
test = pd.read_csv(&#39;/content/drive/MyDrive/Colab Notebooks/ML/data/titanic/test.csv&#39;)
submission = pd.read_csv(&#39;/content/drive/MyDrive/Colab Notebooks/ML/data/titanic/gender_submission.csv&#39;)

# test 데이터 전처리
# 사용하는 coulmn만 추출. 사용되지 않는(불필요한) column을 삭제
# print(train.columns)
# 필요없는 컬럼은(종속변수에 영향을 주지 않거나 의미상 중복 컬럼)
#
test.drop([&#39;PassengerId&#39;, &#39;Ticket&#39;, &#39;Name&#39;, &#39;Fare&#39;, &#39;Cabin&#39;],
           axis=1,
           inplace=True)

# 성별처리 (male:0, female:1)
gender_mapping = {&#39;male&#39;: 0,
                  &#39;female&#39;: 1}
test[&#39;Sex&#39;] = test[&#39;Sex&#39;].map(gender_mapping)


test[&#39;Family&#39;] = test[&#39;SibSp&#39;] + test[&#39;Parch&#39;]

test.drop([&#39;SibSp&#39;, &#39;Parch&#39;],
           axis=1,
           inplace=True)


# df.info()
# Embarked의 결측치를 처리해 보아요!
test[&#39;Embarked&#39;] = test[&#39;Embarked&#39;].fillna(&#39;Q&#39;)

# Embarked 처리
Embarked_mapping = {&#39;S&#39;: 0,
                    &#39;C&#39;: 1,
                    &#39;Q&#39;: 2}
test[&#39;Embarked&#39;] = test[&#39;Embarked&#39;].map(Embarked_mapping)

# 나이를 처리해야 해요! 나이에는 결측치가 많아요!
test[&#39;Age&#39;] = test[&#39;Age&#39;].fillna(test[&#39;Age&#39;].mean())

# 나이에 대해서는....Binning 처리를 해요!
test.loc[test[&#39;Age&#39;] &lt; 8, &#39;Age&#39;] = 0
test.loc[(test[&#39;Age&#39;] &gt;= 8) &amp; (test[&#39;Age&#39;] &lt; 20), &#39;Age&#39;] = 1
test.loc[(test[&#39;Age&#39;] &gt;= 20) &amp; (test[&#39;Age&#39;] &lt; 65), &#39;Age&#39;] = 2
test.loc[test[&#39;Age&#39;] &gt;= 65, &#39;Age&#39;] = 3

# display(test)

x_data_test_norm = scaler.transform(test.values)

predict = keras_model.predict(x_data_test_norm)
# print(predict)

submission[&#39;Survived&#39;] = predict
submission[&#39;Survived&#39;] = np.where((submission[&#39;Survived&#39;] &gt;= 0.5), 1, 0)

submission.to_csv(&#39;./sub.csv&#39;, index=False)</code></pre>
<p><img src="https://velog.velcdn.com/images/m1ng_9/post/4822ba4e-b492-4a8c-bb1c-2568565828db/image.png" alt="">
예제로는 77.75%가 나온 모습이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[12.04 로지스틱 회귀]]></title>
            <link>https://velog.io/@m1ng_9/12.04-%EB%A1%9C%EC%A7%80%EC%8A%A4%ED%8B%B1-%ED%9A%8C%EA%B7%80</link>
            <guid>https://velog.io/@m1ng_9/12.04-%EB%A1%9C%EC%A7%80%EC%8A%A4%ED%8B%B1-%ED%9A%8C%EA%B7%80</guid>
            <pubDate>Sun, 10 Dec 2023 12:58:39 GMT</pubDate>
            <description><![CDATA[<h1 id="로지스틱-회귀">로지스틱 회귀</h1>
<h2 id="실습-예제">실습 예제</h2>
<ul>
<li>만든 모델이 좋은지 안좋지 판단하는것은 평가를 진행하면 됩니다.</li>
<li>데이터를 분할해서 학습하고 평가를 진행합니다</li>
<li><strong>학습에 사용된 데이터는 평가에 사용하지 않습니다</strong>
<img src="https://velog.velcdn.com/images/m1ng_9/post/4ba3ffaf-242f-48a8-89d6-38e9c0996b0d/image.png" alt=""></li>
</ul>
<p><img src="https://velog.velcdn.com/images/m1ng_9/post/f37f0810-f610-4f54-ba98-e26de8ab7ecc/image.png" alt=""></p>
<hr>
<h2 id="분류-모델-성능-평가지표">분류 모델 성능 평가지표</h2>
<h3 id="오차행렬confusion-matrix">오차행렬(Confusion Matrix)</h3>
<p><img src="https://velog.velcdn.com/images/m1ng_9/post/c21dbbe8-4827-495f-90f0-048fe337d3d6/image.png" alt=""></p>
<ul>
<li>실제 정답이 True(1) =&gt; True</li>
<li>실제 정답이 False(0) =&gt; False</li>
<li>모델의 예측값이 True(1) =&gt; Positive</li>
<li>모델의 예측값이 False(0) =&gt; Nagative</li>
<li><em><code>TP</code>,와 <code>TN</code>은 실제값을 맞게 예측한 부분이고, <code>FP</code>와 <code>FN</code>은 실제값과 다르게 예측한 부분을 의미한다. 모델 평가 기준에 사용됩니다.*</em></li>
</ul>
<h3 id="모델-평가-기준">모델 평가 기준</h3>
<h4 id="1-정확도accuracy--전체-중-모델을-바르게-분류한-비율입니다">1. 정확도(Accuracy) : 전체 중 모델을 바르게 분류한 비율입니다.</h4>
<p><img src="https://velog.velcdn.com/images/m1ng_9/post/a959ee18-f020-4ca2-8cc1-519210648a14/image.png" alt=""></p>
<ul>
<li><p>가장 직관적인 성능 평가 지표입니다.</p>
</li>
<li><p>단점으로는 데이터의 편향이 심한 경우 오류가 발생할 수도 있습니다.</p>
</li>
<li><p>ex) 희귀병환자 데이터에서 모델은 0을 출력할 때가 더 많습니다.</p>
<h4 id="2-재현률recall-hit-rate">2. 재현률(Recall, hit rate)</h4>
<p><img src="https://velog.velcdn.com/images/m1ng_9/post/a47e2001-1f75-4e5f-a1d5-dd225891e2fd/image.png" alt=""></p>
<ul>
<li>실제 값이 True인 것 중 모델이 True라 분류한 비율입니다.</li>
<li>위의 오차행렬에서 행방향에 해당하는 부분을 분모로 사용합니다.(TP / TP + FN) (정답 + 정답)</li>
<li>ex) 희귀병환자 데이터에서 우리의 recall 모델은 무조건 1이라고 판단한다.</li>
</ul>
<h4 id="3-정밀도precision">3. 정밀도(Precision)</h4>
<p><img src="https://velog.velcdn.com/images/m1ng_9/post/e4decc88-2f0b-4b76-b6ea-e658c8192d66/image.png" alt=""></p>
<ul>
<li>모델이 True 로 분류한것 중 실제값이 True인 비율입니다.</li>
<li>recall과 헷갈릴수 있습니다. 실제 오차행렬에서 열방향에 해당하는 부분을 분모로 사용합니다. (TP / TP + FP) (예측 + 예측)</li>
<li>recall의 관계와는 <code>반비례</code> 관계를 가지고 있습니다</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/m1ng_9/post/5ec73c6c-c827-4000-914e-2a8290ee87b2/image.png" alt=""></p>
<pre><code>- A모델에서는 검출률이 99%, B모델에서는 검출률이 60%라고 했을때
- 어느 모델이 좋은지는 검출률만보고 판단하기 어렵습니다.
- 이유는 A와 B둘다 오검출을 고려하지 않았기때문입니다.
- A에서 강아지, 고양이 모든 애완동물을 검출해서 99%가 나온 것일 수도 있기 때문입니다.
- B에서는 고양이만 검출했다고 해도 검출률이 낮기 때문에 모델이 좋은지 판단이 되지 않습니다.</code></pre><h4 id="4-f1-score">4. F1 Score</h4>
<p> <img src="https://velog.velcdn.com/images/m1ng_9/post/5062dbb1-3287-4e4c-923a-20aa741ff7e1/image.png" alt="">
    - Precision과 Recall의 조화평균입니다.
    - 주로 데이터가 <strong><code>불균형</code></strong>할때 사용합니다</p>
<h4 id="5-fall-out">5. Fall-out</h4>
<ul>
<li><p>False 중 True로 잘못 예측한 비율입니다.
(FP / FP+ TN) 오차행렬에서 오른쪽의 열부분입니다.</p>
<h4 id="6-roc-curveauc">6. ROC curve/AUC</h4>
</li>
<li><p>ROC curve : FPR(fall-out)이 변할 때, TPR(recall)의 변화를 그린 그림입니다.</p>
<ul>
<li>FPR을 x축, TPR을 y축으로 그립니다. </li>
<li>곡선이 직선 위에 있어야 좋은 모델이고, 직선 아래에 있으면 나쁜 모델, 모델과 함께 직선이면 Random하게 때려맞추는 모델입니다.</li>
</ul>
</li>
<li><p>AUC</p>
<ul>
<li>ROC곡선 아래의 면적입니다, 1에 가까울수록 좋은 수치입니다.</li>
<li>기울기가 1인 직선 아래의 면적이 0.5 -&gt; AUC는 0.5보다 커야합니다.
<img src="https://velog.velcdn.com/images/m1ng_9/post/1364a31b-9244-4d64-bc35-f4be86bdc533/image.png" alt=""></li>
<li>초록색 선이 기준이 되는 직선이고, 빨간선인 ROC curve가 직선에서 멀어져 파란 화살표쪽으로 갈수록, 모델의 성능이 좋은 것 입니다.<h4 id="7-log-losscross-entropy">7. log-loss(cross-entropy)</h4>
</li>
<li>실제 값을 예측하는 확률에 로그를 취하여 부호를 반전시킨 값입니다.</li>
<li>즉 ,분류 모델 자체의 잘못 분류된 수치적인 손실값(loss)를 계산합니다.</li>
<li>log-loss는 낮을수록 좋은 지표이다.</li>
</ul>
<hr>
<h2 id="추가적으로-알아야하는-사항들">추가적으로 알아야하는 사항들</h2>
<h3 id="1-learning-rate">1. Learning rate</h3>
<p><img src="https://velog.velcdn.com/images/m1ng_9/post/117cedcd-12e2-4ffa-824e-3fe45dda67a6/image.png" alt=""></p>
<ul>
<li><p>hyperparameter로 사용하고 기준은 없지만 대부분 1e-4로 시작한다.</p>
</li>
<li><p>미분, 경사하강법에 사용이되고, 알파가 크면 최적의 W를 못찾게 된다.</p>
</li>
<li><p>이런 현상을 <code>Overshooting</code>이라고 한다.</p>
</li>
<li><p>반대로 알파가 작게되면 학습이 적게되어 그것보다 더 좋은 값이 있는데 진행이 되지 못하고 멈추는 것을 말합니다.</p>
</li>
<li><p>이런 값을 <code>local minimum</code>이라고 합니다.</p>
</li>
</ul>
</li>
</ul>
<h3 id="2-정규화normalization">2. 정규화(Normalization)</h3>
<ul>
<li>머신러닝을 할 때, 입력데이터를 <strong><code>0 ~ 1</code></strong> 사이의 값으로 만드는 것<ul>
<li><ol>
<li>모든 feature의 scale을 동일하게 만든다.</li>
</ol>
</li>
<li><ol start="2">
<li>overfitting을 피하고 Noise를 감소시켜준다.</li>
</ol>
<ul>
<li>방법</li>
<li><ol>
<li>Min-Max Normalizaiton(최대, 최소법)</li>
</ol>
</li>
<li><ol start="2">
<li>standardization(평균, 표준편차)<h3 id="3-overfitting">3. Overfitting</h3>
</li>
</ol>
</li>
</ul>
</li>
</ul>
</li>
<li>과적합<ul>
<li>과대적합(overfitting) : 데이터 모델이 너무 잘 들어맞아서 문제다.</li>
<li>과소적합(underfitting) : 모델 학습이 안됐습니다. (큰 문제 X)<h4 id="overfitting-해결법">Overfitting 해결법</h4>
</li>
</ul>
</li>
<li>Training data set에 아주 적합한 모델이지만 실제 데이터에는 적용이 잘 안되는 경우를 말합니다. </li>
<li>거의 항상 발생합니다. (정도를 줄이는것이 매우 중요합니다.</li>
</ul>
<ol>
<li><p>많은 Training Data를 사용</p>
<ul>
<li>Overfitting의 주된 이유는 데이터가 희박하기 때문입니다.</li>
</ul>
</li>
<li><p><code>독립변수(Feature)</code>의 개수를 줄입니다 -&gt; 다중공선성 문제해결</p>
<ul>
<li><code>다중공선성</code>이란 독립변수가 독립변수에 상관 영향이 높아 모델에 영향을 주는것을 말합니다.</li>
</ul>
</li>
<li><p><code>Deep Learning</code></p>
<ul>
<li><code>Dropout</code>기법을 사용합니다.</li>
</ul>
</li>
<li><p><code>규제(Regularization)</code></p>
<ul>
<li>Weight값이 너무 커지지 않도록 인위적으로 조절합니다.</li>
<li>L1규제, L2규제 2가지가 있고 수식이 다릅니다.</li>
</ul>
</li>
<li><p><code>데이터 비대칭 문제(Imbalanced Data Problem)</code></p>
<ul>
<li><ol>
<li><code>undersampling</code> : 데이터의 개수를 줄이는 방법.<ul>
<li>90개의 데이터 -&gt; 20개의 데이터</li>
</ul>
</li>
</ol>
</li>
<li><ol start="2">
<li><code>oversampling</code> : 데이터의 개수를 늘리는 방법.<ul>
<li><ol>
<li>복제 : 같은 데이터가 많아져서 overfitting 가능성</li>
</ol>
</li>
<li><ol start="2">
<li>합성 데이터를 생성 -&gt; SMOTE 알고리즘 사용
<img src="https://velog.velcdn.com/images/m1ng_9/post/64185f8d-b87f-41a8-a5a1-1fba48010b99/image.png" alt=""></li>
</ol>
</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
<li><p><code>K-Fold Cross Validation</code></p>
<ul>
<li>validation data set이 가지고 있는  bias 문제를 해결할 수 있다.</li>
<li>적은 데이터를 이용해서 validation이 가능하다.</li>
<li>하지만 시간이 오래걸리는 단점이 존재한다.</li>
<li>ex) K의 값을 5라고 지정하면 Fold가 5개가 생기고 이것을 통과해서 결과값의 평균을 낸다.
<img src="https://velog.velcdn.com/images/m1ng_9/post/feaf0dbb-8d88-4c4f-a29d-9fa48e886857/image.png" alt=""></li>
</ul>
</li>
</ol>
<hr>
<h1 id="파이썬-구현">파이썬 구현</h1>
<h2 id="1-필요한-module-import">1. 필요한 module import</h2>
<pre><code class="language-python"># Logistic Regression을 구현해 보아요!

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

# 이상치 처리를 위한 import
from scipy import stats

# 정규화 진행을 위한 import
from sklearn.preprocessing import MinMaxScaler
from sklearn import linear_model

# keras import
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Flatten, Dense
from tensorflow.keras.optimizers import SGD</code></pre>
<h2 id="2-데이터-로드-및-전처리">2. 데이터 로드 및 전처리</h2>
<pre><code class="language-python"># Raw Data Loading
df = pd.read_csv(&#39;/content/drive/MyDrive/Colab Notebooks/ML/data/admission/admission.csv&#39;)
# display(df)  # 400 rows × 4 columns

# 결측치 부터 알아보아요!
df.info()
df.isnull().sum()
#  #   Column  Non-Null Count  Dtype  
# ---  ------  --------------  -----  
#  0   admit   400 non-null    int64  
#  1   gre     400 non-null    int64  
#  2   gpa     400 non-null    float64
#  3   rank    400 non-null    int64   
# 결측치는 존재하지 않네요!

# 이상치도 알아보아야 해요!
# 이상치를 눈으로 확인하려면 boxplot을 그려보면 되요!
fig = plt.figure()
fig_gre = fig.add_subplot(1,3,1)
fig_gpa = fig.add_subplot(1,3,2)
fig_rank = fig.add_subplot(1,3,3)

fig_gre.boxplot(df[&#39;gre&#39;])
fig_gpa.boxplot(df[&#39;gpa&#39;])
fig_rank.boxplot(df[&#39;rank&#39;])

plt.tight_layout()
plt.show()

# 수치상 이상치로 표현이 되지만
# 실제 데이터예요!(이상치가 아니예요!)
# 하지만 우리학습을 위해 이상치로 판별된 데이터를 삭제하고 진행

zscore_threshold = 2.0  # zscore 임계값 -2이하, 2이상이면 이상치

for col in df.columns:
    outlier = df[col][np.abs(stats.zscore(df[col])) &gt; zscore_threshold]
    df = df.loc[np.isin(df[col], outlier, invert=True)]

print(df.shape)   # (382, 4)  18개의 데이터가 이상치로 제거!

# 정규화를 진행해야 해요!
x_data = df.drop(&#39;admit&#39;, axis=1, inplace=False).values
t_data = df[&#39;admit&#39;].values.reshape(-1,1)

scaler = MinMaxScaler()
scaler.fit(x_data)
x_data_norm = scaler.transform(x_data)</code></pre>
<p><img src="https://velog.velcdn.com/images/m1ng_9/post/24bc506a-d128-4163-aa01-cb7dc764f7ab/image.png" alt=""></p>
<h2 id="3-sklearn-tensorflow-구현">3. sklearn, Tensorflow 구현</h2>
<pre><code class="language-python"># Model을 구현해 보아요!
# sklearn부터 구현해 보아요!

sklearn_model = linear_model.LogisticRegression()
sklearn_model.fit(x_data,
                  t_data.ravel())

# predict
predict_value = np.array([[600, 3.8, 1]])
result_proba = sklearn_model.predict_proba(predict_value)
print(result_proba)     # [[0.43740782 0.56259218]]

----------------------------------------------------------
# Tensorflow로 구현해 보아요!

keras_model = Sequential()

keras_model.add(Flatten(input_shape=(3,)))
keras_model.add(Dense(units=1,
                      activation=&#39;sigmoid&#39;))

keras_model.compile(optimizer=SGD(learning_rate=1e-4),
                    loss=&#39;binary_crossentropy&#39;)

keras_model.fit(x_data_norm,
                t_data,
                epochs=500,
                verbose=0)

# predict
predict_value = np.array([[600, 3.8, 1]])
predict_value_norm = scaler.transform(predict_value)
result = keras_model.predict(predict_value_norm)
print(result)  

# sklearn : [[0.43740782 0.56259218]]
# tensorflow : [[0.57682455]]</code></pre>
<h1 id="1204-총-정리">12.04 총 정리</h1>
<p><img src="https://velog.velcdn.com/images/m1ng_9/post/f5a72bb8-0f43-49c7-a24b-89f9d2f64057/image.png" alt="">
<img src="https://velog.velcdn.com/images/m1ng_9/post/2e3671fd-993c-4289-904e-ef9cf726320c/image.png" alt=""><img src="https://velog.velcdn.com/images/m1ng_9/post/dbe2c20e-5b1f-4ecc-bb9a-1f9d122a6bde/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[12.01 회귀 및 분류]]></title>
            <link>https://velog.io/@m1ng_9/12.01</link>
            <guid>https://velog.io/@m1ng_9/12.01</guid>
            <pubDate>Fri, 08 Dec 2023 08:17:59 GMT</pubDate>
            <description><![CDATA[<h1 id="회귀">회귀</h1>
<p><img src="https://velog.velcdn.com/images/m1ng_9/post/ee0141ae-fd7c-4176-8470-1cca4f152ef8/image.png" alt=""></p>
<hr>
<h2 id="다중-선형-회귀">다중 선형 회귀</h2>
<ul>
<li>기존 단일 선형 회귀와는 다르게 독립변수가 여러개인 선형 회귀이다.</li>
<li>실습예제 ozone에서 ozone은 temp, 태양광, 바람 모두 영향을 받지만 우리는 단일 선형 회귀를 진행했기때문에 독립변수를 하나만 사용했다.</li>
<li>이제는 다중 선형 회귀에 대해서 알아보겠습니다.</li>
</ul>
<h3 id="모델식">모델식</h3>
<p>모델식이 기존 단일 선형과는 다릅니다.
<img src="https://velog.velcdn.com/images/m1ng_9/post/4149044a-e72b-47df-9e37-6a7c67759840/image.png" alt=""></p>
<ul>
<li>위에  wx + b가 기존 식이라면 wx1, x2 추가적으로 y에 영향을 줍니다.</li>
<li>여기서 식을 조금 바꾸게 되면 오른쪽의 식으로 바뀝니다.</li>
</ul>
<hr>
<h3 id="keras-구현">keras 구현</h3>
<p><img src="https://velog.velcdn.com/images/m1ng_9/post/fccce3b8-0a49-43b3-a103-78e0a0b9c7ff/image.png" alt=""></p>
<ul>
<li>식을 보시면 선형회귀와는 다른점은 <strong>독립변수의 개수</strong>와 input_layer에서의 <strong>feature 개수</strong>의 차이정도입니다.</li>
</ul>
<hr>
<h2 id="회귀-종류">회귀 종류</h2>
<ol>
<li><p><strong>연속적인 숫자값</strong>을 예측하는 회귀</p>
<ul>
<li><ol>
<li>단일 선형 회귀</li>
</ol>
</li>
<li><ol start="2">
<li>다중 선형 회귀</li>
</ol>
</li>
</ul>
</li>
<li><p><strong>이산적인 분류(Classification)값</strong>을 예측하는 회귀</p>
<ul>
<li>로지스틱(Logistic) 회귀 <ul>
<li>이항분류(이진분류)에 대해서 진행합니다. ex) 합격, 불합격</li>
<li>deep learning의 기본 component입니다.</li>
</ul>
</li>
</ul>
</li>
</ol>
<hr>
<h2 id="분류classification">분류(classification)</h2>
<h3 id="이항분류이진분류">이항분류(이진분류)</h3>
<p><img src="https://velog.velcdn.com/images/m1ng_9/post/f207140a-dd02-4a6d-96a2-3909e94b2426/image.png" alt=""></p>
<ul>
<li>위에서 보면 병이 있다 없다로 신용카드가 정상 비정상으로 체크할 수 도 있습니다.</li>
<li>하지만 공부시간 몇시간을 했을때 내가 합격을 할 수 있을지 없을지도 확인할 수 있습니다.</li>
<li>위의 예를들어 모델의 값이 3시간일때 0.6라고 가정할때 6시간을 했을때의 값이 0.9이라고 나오면 합격이라고 나올 확률이 높습니다.</li>
</ul>
<hr>
<p><img src="https://velog.velcdn.com/images/m1ng_9/post/d48c073f-d2fe-404d-a2be-65fce77d8cfa/image.png" alt=""></p>
<ul>
<li>위의 표의 선이 모델의 값입니다.</li>
<li>모델의 선을 기준으로 위쪽이 1 아래가 0 이라고 모델이 판단한 것입니다.</li>
<li>모두 정확하게 나눠지는것은 아닙니다. 하나씩 다르게 판단할때도 있습니다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[11.30 데이터 처리]]></title>
            <link>https://velog.io/@m1ng_9/11.30-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%B2%98%EB%A6%AC</link>
            <guid>https://velog.io/@m1ng_9/11.30-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%B2%98%EB%A6%AC</guid>
            <pubDate>Thu, 07 Dec 2023 13:34:05 GMT</pubDate>
            <description><![CDATA[<h1 id="선형-회귀-모델의-구현방법">선형 회귀 모델의 구현방법</h1>
<h2 id="1129-복습">11.29 복습</h2>
<p><img src="https://velog.velcdn.com/images/m1ng_9/post/be609fd3-8301-4ff2-9cdd-4275d0a796a2/image.png" alt="">
<img src="https://velog.velcdn.com/images/m1ng_9/post/83ad48b5-196c-41c1-9f15-564f338e6d6d/image.png" alt="">
<img src="https://velog.velcdn.com/images/m1ng_9/post/7375146a-fbf3-4812-9c1a-d5f2018c33a5/image.png" alt="">
<img src="https://velog.velcdn.com/images/m1ng_9/post/b25f82b6-4f59-40d4-ae67-1cc05648e8b2/image.png" alt="">
위의 상태로 진행되게 됩니다.
이때 맨밑 그림에서 이상치들이 발생합니다. </p>
<hr>
<h1 id="데이터-전처리">데이터 전처리</h1>
<ol>
<li>결측치 처리</li>
<li>이상치 처리</li>
<li>정규화 처리
순서대로 진행하는것이 좋습니다.</li>
</ol>
<hr>
<h2 id="이상치">이상치</h2>
<p>모델이 회귀모델 즉 조건부 평균을 구하는 것인데 이런 이상치가 발생하게되면 모델이 좋아지지 않는다.
독립변수(Temp) =&gt; 여기서 발생하는 편차가 큰 값은 =&gt; <strong>지대점</strong>
종속변수(Ozone) =&gt; 여기서 발생하는 편차가 큰 값 =&gt; <strong>이상치(outlier)</strong></p>
<h3 id="이상치-제거-방법">이상치 제거 방법</h3>
<ol>
<li>Tukey&#39;s Fense 방식 =&gt; 사분위를 이용
<img src="https://velog.velcdn.com/images/m1ng_9/post/68e07e16-0ed6-4ae9-b5b1-f616d457e62d/image.png" alt="">
boxplot을 그린 후 maximum보다 더 크거나 minimum 더 작으면 <strong>이상치</strong>로 판단한다.</li>
<li>정규분포(Z -score)
<img src="https://velog.velcdn.com/images/m1ng_9/post/27840662-6c3b-4bbb-985b-e9264a87c1ee/image.png" alt=""></li>
</ol>
<p><strong>Z-score</strong>는 각 포인터들 평균과의 거리가 얼마나 멀어져있는지 확인을 한 후 <strong>+-2</strong>이 넘어가면 <strong>이상치</strong>로 판단한다.</p>
<p>이상치를 모두 제거한다고 하더라도 우리가 원하는 모델이 완성되지 않았습니다. 왜 why?
정규화를 진행하지 않았기때문입니다.</p>
<hr>
<h2 id="정규화">정규화</h2>
<h3 id="정규화를-해야하는-이유">정규화를 해야하는 이유</h3>
<ol>
<li>feature scale을 조정한다.</li>
<li>학습속도를 향상시켜준다.</li>
<li>특정 feature에 가중치가 더 부여되는 overfitting을 피할 수 있다.</li>
<li>수치안정성(계산의 정확도가 높아진다)</li>
<li>거리기반 알고리즘들이 존재하는데 이 알고리즘을 사용할때는 필수적으로 사용해야한다.</li>
</ol>
<h3 id="정규화-방법">정규화 방법</h3>
<p><strong>1. Min-Max normalization(scaling)</strong></p>
<ul>
<li>정규화를 하는 가장 일반적인 방법이다.</li>
<li>모든 feature에 대해 최소 0 ~ 최대 1의 값을 설정하는 것이다.</li>
<li>이상치에 민감하다.
<img src="https://velog.velcdn.com/images/m1ng_9/post/f3168e48-70e0-47d2-a65a-2823782840b6/image.png" alt="">
<strong>2. Standardization(Z-score Nomalization)</strong></li>
<li>평균 및 표준편차와의 관계측면에서 데이터 포인트를 설명하는 방법이다.</li>
<li>이상치에 둔감하다
<img src="https://velog.velcdn.com/images/m1ng_9/post/dce85d8e-bb60-4735-8430-a608e1d2ff33/image.png" alt=""></li>
</ul>
<hr>
<h1 id="파이썬-구현">파이썬 구현</h1>
<h2 id="ozone-데이터-실습-예제">Ozone 데이터 실습 예제</h2>
<h3 id="python-직접-구현">python 직접 구현</h3>
<pre><code class="language-python"># python 직접구현
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 수치미분코드
def numerical_derivative(f, x): # x가 다변수함수이기때문에 2개가 들어가야함

    delta_x =1e-4
    derivative_x = np.zeros_like(x) # [0.0, 0.0]

    it = np.nditer(x, flags=[&#39;multi_index&#39;])

    while not it.finished:

        idx = it.multi_index   # 현재의 index를 추출 =&gt; tuple형태로 리턴

        tmp = x[idx]    # 현재 index의 값을 일단 잠시 보존해요.
                        # 밑에서 이 값을 변경해서 중앙차분 값을 계산해야함
                        # 그런데 우리 편미분을 해야하는데 다음 변수 편미분을 할때에
                        # 원래값으로 복원해야 정상적으로 진행되기 때문에
                        # 이 값을 잠시 보관했다가 원상태로 복구해야함
        x[idx] = tmp + delta_x
        fx_plus_delta_x = f(x)   # f(x + delta_x)

        x[idx] = tmp - delta_x
        fx_minus_delta_x = f(x)

        derivative_x[idx] = (fx_plus_delta_x - fx_minus_delta_x) / (2 * delta_x)

        x[idx] = tmp

        it.iternext()
    return derivative_x

# Raw Data Loading
df = pd.read_csv(&#39;/content/drive/MyDrive/Colab Notebooks/ML/data/ozone/ozone.csv&#39;)
# display(df)

# 그러면 먼저 사용할 데이터를 추출해보자
training_data = df[[&#39;Temp&#39;, &#39;Ozone&#39;]]
# display(training_data)   # 153 rows × 2 columns

# 삭제해서 사용해보자
training_data = training_data.dropna(how=&#39;any&#39;)
# display(training_data)   # 116 rows × 2 columns

# Training Data Set
x_data = training_data[&#39;Temp&#39;].values.reshape(-1,1)
t_data = training_data[&#39;Ozone&#39;].values.reshape(-1,1)

# Model을 만들어야하는데.. y = Wx + b
W = np.random.rand(1,1)
b = np.random.rand(1)

# loss function(MSE)
def loss_func(input_data):

    input_w = input_data[0]
    input_b = input_data[1]

    y = np.dot(x_data, input_w) + input_b

    # loss 함수는 mse를 리턴해줌
    return np.mean(np.power((t_data - y), 2))

# 예측작업을 해야 해요! 그래서 예측을 해주는 함수를 하나 정의
def predict(x):   # 입력값 x

    return np.dot(x, W) + b

# 하이퍼파라미터 설정
# epoch =&gt; 전체를 한번 도는것
# lenaring rate 정의
learning_rate = 1e-4

# 학습을 진행
for step in range(300000):

    # 현재 W는 2차원, b는 1차원입니다
    # 그런데 이게 loss함수 안으로 들어갈때는 1차원 안에 두 값이
    # 순서대로 들어가 있어야 한다
    # ravel() 1차원으로 펴주는 함수
    # concatenate로 둘의 1차원 값을 합쳐줌.
    # 어디로 붙일지 지정을 해줘야함.
    # 축을 설정해주어야함.
    # 입력인자를 설정해주었음.
    input_param = np.concatenate((W.ravel(), b.ravel()), axis=0)
    derivative_result = learning_rate * numerical_derivative(loss_func, input_param)

    # 이제 입력인자를 미분해주어야함.
    # 미분함수에 loss함수를 넣고, 입력인자를 넣어줌.
    # learning rate를 설정하고 함수 결과를 선언해줌
    W = W - derivative_result[0].reshape(-1,1)
    b = b - derivative_result[1]

    # 확인 작업
    if step % 30000 == 0:
        print(f&#39;W: {W}, b: {b}, loss: {loss_func(input_param)}&#39;)

# 학습종료 후 예측
# 온도가 62도일때 Ozone량은 얼마?
print(predict(np.array([[62]])))  # [[16.88607015]]
# 이거 맞는거야???
# 그래프로 확인해 보아요!
# (독립변수 1개니까 2차원 평면에 모델을 그릴수 있어요!)

# 데이터를 2차원 평면에 찍어보아요!
plt.scatter(x_data, t_data)   # [[16.88607015]]
# 우리 모델을 그려보아요!
plt.plot(x_data, x_data*W.ravel() + b, color=&#39;r&#39;)
plt.show()</code></pre>
<p><img src="https://velog.velcdn.com/images/m1ng_9/post/19de87ac-63cc-459a-945f-fe7b3e6bf8ed/image.png" alt=""></p>
<hr>
<h3 id="tensorflow-구현">Tensorflow 구현</h3>
<pre><code class="language-python"># 같은 내용을 이제 Tensorflow Keras를 이용해서 구현!

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

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Flatten, Dense
from tensorflow.keras.optimizers import SGD

# Raw Data Loading
df = pd.read_csv(&#39;/content/drive/MyDrive/Colab Notebooks/ML/data/ozone/ozone.csv&#39;)

training_data = df[[&#39;Temp&#39;, &#39;Ozone&#39;]]

# 이렇게 데이터를 가져온 후 당연히 데이터 전처리를 해야 해요!
# 1. 결측치 처리!
training_data = training_data.dropna(how=&#39;any&#39;)

# Training Data Set 준비
x_data = training_data[&#39;Temp&#39;].values.reshape(-1,1)
t_data = training_data[&#39;Ozone&#39;].values.reshape(-1,1)

# Model 생성
model = Sequential()

model.add(Flatten(input_shape=(1,)))

output_layer = Dense(units=1,
                     activation=&#39;linear&#39;)

model.add(output_layer)

# model 설정
model.compile(optimizer=SGD(learning_rate=1e-4),
              loss=&#39;mse&#39;)

# model 학습
model.fit(x_data,
          t_data,
          epochs=2000,
          verbose=0)

# 학습이 끝났으니 예측을 해 보아요!
print(model.predict(np.array([[62]])))  # [[39.92358]]

# 그래프로 확인해 보아요!
# W와 b가 필요해요!
weights, bias = output_layer.get_weights()

# 데이터를 2차원 평면에 찍어보아요!
plt.scatter(x_data, t_data)
# 우리 모델을 그려보아요!
plt.plot(x_data, x_data*weights + bias, color=&#39;r&#39;)
plt.show()   # [[39.92358]]</code></pre>
<p><img src="https://velog.velcdn.com/images/m1ng_9/post/517611d1-6089-44d2-bfac-0853c721385f/image.png" alt=""></p>
<hr>
<h3 id="sklearn-구현">sklearn 구현</h3>
<pre><code class="language-python"># 정답(?)을 확인하기 위해 sklearn 구현을 해 보아요!

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import linear_model


# Raw Data Loading
df = pd.read_csv(&#39;/content/drive/MyDrive/Colab Notebooks/ML/data/ozone/ozone.csv&#39;)

training_data = df[[&#39;Temp&#39;, &#39;Ozone&#39;]]

# 이렇게 데이터를 가져온 후 당연히 데이터 전처리를 해야 해요!
# 1. 결측치 처리!
training_data = training_data.dropna(how=&#39;any&#39;)

# Training Data Set 준비
x_data = training_data[&#39;Temp&#39;].values.reshape(-1,1)
t_data = training_data[&#39;Ozone&#39;].values.reshape(-1,1)

# Model 생성
sklearn_model = linear_model.LinearRegression()

# Model 학습
sklearn_model.fit(x_data, t_data)

# W와 b를 알아야지 나중에 그래프를 그릴 수 있겠죠.
weights = sklearn_model.coef_
bias = sklearn_model.intercept_

# 예측을 해 보아요!
print(sklearn_model.predict(np.array([[62]])))  # [[3.58411393]]

# 데이터를 2차원 평면에 찍어보아요!
plt.scatter(x_data, t_data)
# 우리 모델을 그려보아요!
plt.plot(x_data, x_data*weights + bias, color=&#39;r&#39;)
plt.show()</code></pre>
<p><img src="https://velog.velcdn.com/images/m1ng_9/post/9848c1e7-c7b0-4704-88c8-0141412d96a6/image.png" alt=""></p>
<hr>
<h2 id="이상치-제거">이상치 제거</h2>
<pre><code class="language-python"># Tukey&#39;s Fence 방식으로 이상치를 검출해보아요!

import numpy as np
import matplotlib.pyplot as plt

data = np.array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,22.1])

fig = plt.figure()

fig_1 = fig.add_subplot(1,2,1)  # 1행 2열의 첫번째
fig_2 = fig.add_subplot(1,2,2)  # 1행 2열의 두번째

print(np.median(data))  # 8.0
print(np.percentile(data,25))  # 4.5
print(np.percentile(data,75))  # 11.5

# IQR value
iqr_value = np.percentile(data,75) - np.percentile(data,25)
print(iqr_value)  # 7.0

upper_fence = np.percentile(data,75) + 1.5 * iqr_value
print(upper_fence)  # 22.0
lower_fence = np.percentile(data,25) - 1.5 * iqr_value
print(lower_fence)  # -6.0

# 아하!! 이렇게 tukey fence방식을 이용하면 이상치를 구분하는
# 기준선을 알아낼 수 있네요!

# 내가 가지고 있는 데이터에 대해 이상치를 출력해보세요!
# boolean indexing을 이용해요!

print(data[(data &gt; upper_fence) | (data &lt; lower_fence)])  # [22.1]

# 데이터를 정제하는게 목적이예요. 이상치를 제거하는게 목적!
result_data = data[(data &lt;= upper_fence) &amp; (data &gt;= lower_fence)]
print(result_data)

fig_1.set_title(&#39;Original Data&#39;)
fig_1.boxplot(data)

fig_2.set_title(&#39;Remove Outlier Data&#39;)
fig_2.boxplot(result_data)

plt.tight_layout()
plt.show()</code></pre>
<p><img src="https://velog.velcdn.com/images/m1ng_9/post/3b05ea17-521c-4985-914f-90bbf4652722/image.png" alt=""></p>
<hr>
<pre><code class="language-python"># 정규분포(Z-score)를 이용한 이상치 구별방식
# 이 방식을 이용하려면
# 기본적으로 우리 데이터를 정규분포화 시켜서 우리 데이터에 대한
# z-score값을 각각 구해야 되요!
# 그리고 기준치를 설정한 다음 그 기준치를 넘는 데이터를 이상치로 판별

from scipy import stats

data = np.array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,22.1])

zscore_threshold = 2.0 # 일반적으로 2.0을 많이 사용.

# print(np.abs(stats.zscore(data)) &gt; zscore_threshold)
outlier = data[np.abs(stats.zscore(data)) &gt; zscore_threshold] # [22.1]

# 이상치를 제거한 결과
print(data[np.isin(data,outlier, invert=True)])  
# [ 1.  2.  3.  4.  5.  6.  7.  8.  9. 10. 11. 12. 13. 14.</code></pre>
<hr>
<pre><code class="language-python">from scipy import stats

# 데이터는 공통으로 사용하니 먼저 사용하는 데이터 정제부터 하고
# 각각 구현하는게 좋을 듯 싶어요!

# Raw Data Loading
df = pd.read_csv(&#39;/content/drive/MyDrive/Colab Notebooks/ML/data/ozone/ozone.csv&#39;)

training_data = df[[&#39;Temp&#39;, &#39;Ozone&#39;]]

# 이렇게 데이터를 가져온 후 당연히 데이터 전처리를 해야 해요!
# 1. 결측치 처리!
training_data = training_data.dropna(how=&#39;any&#39;)
# 2. 이상치 처리!
zscore_threshold = 1.8

outlier = training_data[&#39;Ozone&#39;][np.abs(stats.zscore(training_data[&#39;Ozone&#39;].values)) &gt; zscore_threshold]

# print(outlier)

# 이상치를 제거한 결과를 얻어야 해요!
# 내가 가진 DataFrame에서 이상치를 제거하면 되요!
training_data = training_data.loc[np.isin(training_data[&#39;Ozone&#39;],outlier, invert=True)]

# Training Data Set 준비
x_data = training_data[&#39;Temp&#39;].values.reshape(-1,1)
t_data = training_data[&#39;Ozone&#39;].values.reshape(-1,1)
</code></pre>
<hr>
<h2 id="이상치-제거-후-구현">이상치 제거 후 구현</h2>
<h3 id="python-직접-구현-1">python 직접 구현</h3>
<pre><code class="language-python"># Python 직접구현

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

## 수치미분 코드
def numerical_derivative(f,x):

    # f : 미분하려고하는 다변수 함수
    # x : 모든 변수를 포함하는 ndarray  [1.0 2.0]
    # 리턴되는 결과는 [8.0 15.0]

    delta_x = 1e-4
    derivative_x = np.zeros_like(x)   #  [0.0 0.0]

    it = np.nditer(x, flags=[&#39;multi_index&#39;])

    while not it.finished:

        idx = it.multi_index  # 현재의 index를 추출 =&gt; tuple형태로 리턴.

        tmp = x[idx]    # 현재 index의 값을 일단 잠시 보존해야해요!
                        # 밑에서 이 값을 변경해서 중앙차분 값을 계산해야 해요!
                        # 그런데 우리 편미분해야해요. 다음 변수 편미분할때
                        # 원래값으로 복원해야 편미분이 정상적으로 진행되기 때문에
                        # 이값을 잠시 보관했다가 원상태로 복구해야 해요!
        x[idx] = tmp + delta_x
        fx_plus_delta_x = f(x)  # f(x + delta_x)

        x[idx] = tmp - delta_x
        fx_minus_delta_x = f(x) # f(x - delta_x)

        derivative_x[idx] = (fx_plus_delta_x - fx_minus_delta_x) / (2 * delta_x)

        x[idx] = tmp

        it.iternext()

    return derivative_x

# Model을 만들어야 하는데.. y = Wx + b
W = np.random.rand(1,1)
b = np.random.rand(1)

# loss function(MSE)
def loss_func(input_data):

    input_w = input_data[0]
    input_b = input_data[1]

    y = np.dot(x_data, input_w) + input_b

    return np.mean(np.power((t_data-y),2))

# 모델이 완성된 후 예측하는 함수를 하나 만들어요!
def predict(x):

    return np.dot(x, W) + b

# learning rate 정의(hyperparameter)
learning_rate = 1e-4

# 학습진행
for step in range(300000):

    input_param = np.concatenate((W.ravel(), b.ravel()), axis=0)
    derivative_result = learning_rate * numerical_derivative(loss_func, input_param)

    W = W - derivative_result[0].reshape(-1,1)
    b = b - derivative_result[1]

    if step % 30000 == 0:
        print(f&#39;W : {W}, b : {b}, loss : {loss_func(input_param)}&#39;)

# 학습종료 후 예측
# 온도가 62도일때 Ozone량은 얼마?
print(predict(np.array([[62]])))  # [[15.51232223]]</code></pre>
<hr>
<h3 id="tensorflow-구현-1">Tensorflow 구현</h3>
<pre><code class="language-python"># 같은 내용을 이제 Tensorflow Keras를 이용해서 구현!

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Flatten, Dense
from tensorflow.keras.optimizers import SGD

# Model 생성
model = Sequential()

model.add(Flatten(input_shape=(1,)))

output_layer = Dense(units=1,
                     activation=&#39;linear&#39;)

model.add(output_layer)

# model 설정
model.compile(optimizer=SGD(learning_rate=1e-4),
              loss=&#39;mse&#39;)

# model 학습
model.fit(x_data,
          t_data,
          epochs=2000,
          verbose=0)

# 학습이 끝났으니 예측을 해 보아요!
print(model.predict(np.array([[62]])))  # [[37.21062]]

# 그래프로 확인해 보아요!
# W와 b가 필요해요!
weights, bias = output_layer.get_weights()</code></pre>
<hr>
<h3 id="sklearn-구현-1">sklearn 구현</h3>
<pre><code class="language-python"># 정답(?)을 확인하기 위해 sklearn 구현을 해 보아요!

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import linear_model


# Model 생성
sklearn_model = linear_model.LinearRegression()

# Model 학습
sklearn_model.fit(x_data, t_data)

# 예측을 해 보아요!
print(sklearn_model.predict(np.array([[62]])))  # [[4.51299041]]</code></pre>
<hr>
<h2 id="그래프로-확인해보기">그래프로 확인해보기</h2>
<pre><code class="language-python">####### 결과를 그래프로 확인해 보아요! #########

fig = plt.figure()

fig_python = fig.add_subplot(1,3,1)
fig_tensorflow = fig.add_subplot(1,3,2)
fig_sklearn = fig.add_subplot(1,3,3)

fig_python.set_title(&#39;python&#39;)
fig_tensorflow.set_title(&#39;tensorflow&#39;)
fig_sklearn.set_title(&#39;sklearn&#39;)

fig_python.scatter(x_data, t_data)
fig_python.plot(x_data, x_data*W.ravel() + b, color=&#39;r&#39;)

fig_tensorflow.scatter(x_data, t_data)
fig_tensorflow.plot(x_data, x_data*weights + bias, color=&#39;b&#39;)

fig_sklearn.scatter(x_data, t_data)
fig_sklearn.plot(x_data,
                 x_data*sklearn_model.coef_ + sklearn_model.intercept_,
                 color=&#39;g&#39;)

plt.tight_layout()
plt.show()</code></pre>
<p><img src="https://velog.velcdn.com/images/m1ng_9/post/5ec9bdd3-253c-4ed7-97e5-44d47a402d6e/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[11. 29 ML에 대하여]]></title>
            <link>https://velog.io/@m1ng_9/11.-29</link>
            <guid>https://velog.io/@m1ng_9/11.-29</guid>
            <pubDate>Wed, 06 Dec 2023 07:59:33 GMT</pubDate>
            <description><![CDATA[<h1 id="회귀regression">회귀(Regression)</h1>
<p>우리는 지난날에 회귀에 대해 기본적인 틀을 알아보았다.
정리를 하자면 회귀는 조건부 평균을 구하는 방법이며 <strong>평균을 구하는 식(Regression Model(회귀 모델))</strong>을 우리가 찾아내는 것이다.</p>
<ol>
<li>평균을 구하는 기법이기때문에 평균이 의미를 가지는 Data에 대해 회귀 모델이 더 잘 만들어집니다.</li>
<li>단변량을 가정합니다</li>
<li>기반 모델은 고전적 선형 회귀 모델(Classical Linear Regression Model)을 사용합니다
<img src="https://velog.velcdn.com/images/m1ng_9/post/6f933a73-f0a9-4d73-8269-c44cf7e838c9/image.png" alt=""></li>
<li>회귀는 Target(Label)의 형태에 따라 종류가 나뉩니다.<ul>
<li>연속적인 숫자값 :Linear Regression(선형 회귀) </li>
<li>이산적인 분류값 : Classification(분류) ex) Logistic Regression</li>
</ul>
</li>
</ol>
<p>그림으로 보게되면</p>
<p><img src="https://velog.velcdn.com/images/m1ng_9/post/cf415033-5027-4766-91df-bf83b58cf9d2/image.png" alt=""></p>
<p>위와 같이 입력에 데이터 셋을 모델에 넣고 예측을 하게 됩니다.</p>
<p>이때의 식은 아래와 같습니다.
<img src="https://velog.velcdn.com/images/m1ng_9/post/8ae1c212-c0bc-48a0-9ecb-6d906673386b/image.png" alt=""></p>
<hr>
<h1 id="오차error">오차(Error)</h1>
<ul>
<li>회귀 모델은 결과적으로 우리가 어떤 값을 넣게 되면 그 값이 어떤 값이 나오는지 예측하는 것입니다. </li>
<li>모델이 좋으면 평균과 오차가 적으면 좋을 것 입니다.
<img src="https://velog.velcdn.com/images/m1ng_9/post/814e5ca5-c867-4ea8-9365-3747ae95de41/image.png" alt="">
위의 그림처럼 평균선에 대해서 크면<code>+</code> 작으면<code>-</code>로 나타낼 수 있습니다.
우리는 여기서 이 오차를 하나의 값으로 계산을 하려고 합니다.</li>
</ul>
<h2 id="오차-함수loss-function">오차 함수(Loss function)</h2>
<ul>
<li>여기서 예측값과 실제값의 차이를 나타내는 매커니즘을 오차 함수라고 표현합니다.</li>
</ul>
<p>Loss 함수를 만드는 방법입니다.</p>
<ol>
<li>error를 더한다 -&gt; 부호때문에 이상적인 loss값으로 사용하기 힘듭니다. X</li>
<li>error의 절대값의 합을 구한다. -&gt; 좋습니다! loss값을 이 방식으로 계산할 수 있습니다.   O</li>
<li>error의 제곱의 평균을 구한다 -&gt; 평균 제곱 오차(Mean Squared Error)  O</li>
</ol>
<h2 id="오차-함수와-학습률">오차 함수와 학습률</h2>
<p>여기서 모델과 오차의 식을 보겠습니다
<img src="https://velog.velcdn.com/images/m1ng_9/post/44881a5a-f333-4a63-8eb9-35f049ced06e/image.png" alt="">
여기서 수학식으로 대입을 하여 바꿔주면
<img src="https://velog.velcdn.com/images/m1ng_9/post/0b45a6f3-dfde-44ce-8951-b54e7c74268d/image.png" alt="">
위와 같은 그림에서 식이 완성되게 됩니다.
loss는 모든 데이터에 대한 평균 오차값이라고도 할 수 있습니다.</p>
<p><img src="https://velog.velcdn.com/images/m1ng_9/post/7329638b-0ae3-4691-b4a6-ee17cb93a7e6/image.png" alt=""> 
loss는 W의 2차함수이고, 이 그래프는 포물선 그래프입니다.
loss는 작으면 작을수록 좋기때문에 loss가 최소가 되는 w ~ b를 찾으면 됩니다.</p>
<ul>
<li>W에서의 값에서의 미분을 하게 되면 해당 지점의 기울기를 나타냅니다.</li>
<li>그 값이 포물선의 중앙에 오게 되면은 평평해지며 기울기가 0이 됩니다.</li>
<li>기울기 식은 학습률(learning rate)와 관련이 있습니다.</li>
<li>미분을 하면서 가장 최적의 값을 찾으려고 내려가기때문입니다.
이걸 <strong>경사 하강(gradient descent)</strong>라고 한다. </li>
</ul>
<hr>
<h2 id="구현-flow">구현 flow</h2>
<p><img src="https://velog.velcdn.com/images/m1ng_9/post/9ee1541e-5edf-4bd3-b239-924376629435/image.png" alt=""></p>
<ol>
<li>feature와 label이 같이 있는 데이터를 입력하고 Model을 거쳐 예측값과 정답을 비교한다.</li>
<li>loss 함수를 learning rate만큼 거쳐서 오차범위를 줄이고, 다시 모델로 들어간다 이 한바퀴 반복 과정을 Epoch이라고 한다.</li>
<li>설정한 Epoch을 거쳐 모델의 학습이 완료된다.</li>
</ol>
<h2 id="구현-flow-수식">구현 flow 수식</h2>
<p><img src="https://velog.velcdn.com/images/m1ng_9/post/2da4af82-40a6-4186-9276-69ead3b3b3b5/image.png" alt="">
모델의 식에 입력 데이터 값인 x1,x2,x3,x4에 값이 들어가고, 그 값에 가중치와 bias가 더해지면서 값이 나오게된다.
이렇게 반복하게 되면서 모델이 생성된다.</p>
<h1 id="tensorflow">Tensorflow</h1>
<h2 id="tensorflow란">Tensorflow란</h2>
<ol>
<li>open source library</li>
<li>수치계산용 library</li>
<li>data flow graph를 이용해서 Tensor처리(다차원 data)</li>
</ol>
<h2 id="keras">Keras</h2>
<p><img src="https://velog.velcdn.com/images/m1ng_9/post/799c3c93-68e6-48f3-b5ff-a362c9b5ad69/image.png" alt=""></p>
<ol>
<li>Tensorflow keras 구현은 상자(Sequential)모델 2차원 matrix에서 input_layer(Flatten)를 통해 feature 1개에 모델이 하나가 mapping이되서 들어가고</li>
<li>output_layer(Dense)에서 W가중치가 계산이 되고, bias가 더해진 후 actvation이 추가로 계산되어 밖으로 나가게된다.</li>
<li>그 후 예측값과 정답을 비교하고 설정해둔 optimizer를 통해 다시 epoch을 돌게된다.</li>
</ol>
<hr>
<h1 id="파이썬-구현">파이썬 구현</h1>
<h2 id="간단-선형-회귀">간단 선형 회귀</h2>
<pre><code class="language-python">import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({&#39;공부시간(x)&#39;: [1,2,3,4,5,7,8,10,12,13,14,15,18,20,25,28,30], &#39;시험점수(t)&#39;:[5,7,20,31,40,44,46,49,60,62,70,80,85,91,92,97,98]})

display(df.head())

plt.scatter(df[&#39;공부시간(x)&#39;],df[&#39;시험점수(t)&#39;])
plt.plot(df[&#39;공부시간(x)&#39;], df[&#39;공부시간(x)&#39;]*2 + 3, color=&#39;r&#39;)
plt.plot(df[&#39;공부시간(x)&#39;], df[&#39;공부시간(x)&#39;]*5 - 7, color=&#39;g&#39;)
plt.plot(df[&#39;공부시간(x)&#39;], df[&#39;공부시간(x)&#39;]*1 + 8, color=&#39;b&#39;)
plt.plot(df[&#39;공부시간(x)&#39;], df[&#39;공부시간(x)&#39;]*4 - 10, color=&#39;magenta&#39;)
plt.show()</code></pre>
<p><img src="https://velog.velcdn.com/images/m1ng_9/post/d7595b82-75cc-434c-afda-236fc3877e39/image.png" alt=""></p>
<pre><code class="language-python">import numpy as np

# Training Data Set
x_data = np.array([1,2,3,4,5]).reshape(5,1)
t_data = np.array([3,5,7,9,11]).reshape(5,1)

# model =&gt; y = Wx + b
# rand() =&gt; 0과 1사이의 난수를 균등분포에서 발생시켜요!
W = np.random.rand(1,1)
b = np.random.rand(1)

# loss function
def loss_func(input_data):

    input_W = input_data[0]
    input_b = input_data[1]

    # Y = XW + b
    y = np.dot(x_data, input_W) + input_b

    return np.mean(np.power((t_data - y), 2))

# 미분해주는 함수가 있어야 해요!
def numerical_derivative(f,x):

    # f : 미분하려고하는 다변수 함수
    # x : 모든 변수를 포함하는 ndarray  [1.0 2.0]
    # 리턴되는 결과는 [8.0 15.0]

    delta_x = 1e-4
    derivative_x = np.zeros_like(x)   #  [0.0 0.0]

    it = np.nditer(x, flags=[&#39;multi_index&#39;])

    while not it.finished:

        idx = it.multi_index  # 현재의 index를 추출 =&gt; tuple형태로 리턴.

        tmp = x[idx]    # 현재 index의 값을 일단 잠시 보존해야해요!
                        # 밑에서 이 값을 변경해서 중앙차분 값을 계산해야 해요!
                        # 그런데 우리 편미분해야해요. 다음 변수 편미분할때
                        # 원래값으로 복원해야 편미분이 정상적으로 진행되기 때문에
                        # 이값을 잠시 보관했다가 원상태로 복구해야 해요!
        x[idx] = tmp + delta_x
        fx_plus_delta_x = f(x)  # f(x + delta_x)

        x[idx] = tmp - delta_x
        fx_minus_delta_x = f(x) # f(x - delta_x)

        derivative_x[idx] = (fx_plus_delta_x - fx_minus_delta_x) / (2 * delta_x)

        x[idx] = tmp

        it.iternext()

    return derivative_x

# 학습이 다 종료되면(모델이 다 만들어지면)
# 예측작업을 해야 해요! 그래서 예측을 해주는 함수를 하나 정의
def predict(x):

    return np.dot(x,W) + b

# learning rate 정의
learning_rate = 1e-4

# 학습을 진행
for step in range(300000):

    # 현재 W는 2차원, b는 1차원이예요!
    # 그런데 이게 loss함수안으로 들어갈때는 1차원 안에 두 값이
    # 순서대로 들어가 있어야 해요!
    input_param = np.concatenate((W.ravel(), b.ravel()), axis=0)
    derivative_result = learning_rate * numerical_derivative(loss_func, input_param)

    W = W - derivative_result[0].reshape(-1,1)
    b = b - derivative_result[1]

    # 확인작업
    if step % 30000 == 0:
        print(f&#39;W : {W}, b: {b}, loss: {loss_func(input_param)}&#39;)


# W: [[0.8533673]], b: [0.10691388], loss: 21.505695738228287
# W: [[2.05368836]], b: [0.806168], loss: 0.006839013386449011
# W: [[2.0194703]], b: [0.92970603], loss: 0.0008994533618923671
# W: [[2.00706099]], b: [0.9745076], loss: 0.00011829430716160621
# W: [[2.0025607]], b: [0.99075508], loss: 1.5557830677745438e-05
# W: [[2.00092865]], b: [0.99664729], loss: 2.0461347735503135e-06
# W: [[2.00033678]], b: [0.99878413], loss: 2.691035529462717e-07
# W: [[2.00012213]], b: [0.99955906], loss: 3.5391961050585345e-08
# W: [[2.00004429]], b: [0.99984009], loss: 4.6546799299037875e-09
# W: [[2.00001606]], b: [0.99994201], loss: 6.121741945875743e-10

# 결과 예측하기 7을 넣었을때의 값
predict_result = predict(np.array([7]).reshape(1,1))

print(predict_result)   # [[15.00001975]]</code></pre>
<hr>
<h2 id="tensorflow-구현">Tensorflow 구현</h2>
<pre><code class="language-python"># Tensorflow Keras 구현

import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Flatten, Dense
from tensorflow.keras.optimizers import SGD

# Training Data Set
x_data = np.array([1,2,3,4,5]).reshape(5,1)
t_data = np.array([3,5,7,9,11]).reshape(5,1)

# Model 생성
model = Sequential()

# Model 안에 layer를 생성
# Flatten == input_layer
# input_shape안에는 반드시 tuple이 들어가야함
# 1이라는건 feature를 의미
# activation 함수 설정
model.add(Flatten(input_shape=(1,)))
model.add(Dense(units=1, activation=&quot;linear&quot;))

# 모델이 완성되었으면 기타 옵션들을 설정해야 한다.
# 어떤 최적화 알고리즘 방식을 사용할지 설정하는 optimizer
# learning_rate도 같이 설정
# loss는 평균제곱오차 mse를 사용
model.compile(optimizer=SGD(learning_rate=1e-2), loss=&#39;mse&#39;)

# 모델 학습
model.fit(x_data,
          t_data,
          epochs=5000,
          verbose=0)

# 예측을 해 보아요!
print(model.predict(np.array([[10]])))  # [[21.000032]]</code></pre>
<h2 id="sklearn-구현">sklearn 구현</h2>
<pre><code class="language-python"># sklearn을 이용해 해보자
# sklearn은 일반사람들도 쉽고 편하게 머신러닝을 할 수 있도록
# 모델을 제공해줘요!

import numpy as np
from sklearn import linear_model

# Training Data Set
x_data = np.array([1,2,3,4,5]).reshape(5,1)
t_data = np.array([3,5,7,9,11]).reshape(5,1)

sklearn_model = linear_model.LinearRegression()

sklearn_model.fit(x_data,
                  t_data)

print(sklearn_model.predict(np.array([[10]])))   # [[21.]]</code></pre>
<h2 id="ozone-데이터-실습-예제">Ozone 데이터 실습 예제</h2>
<pre><code class="language-python"># ozone.csv 파일을 이용해서 머신러닝 모델을 만들어 보아요
# python 구현

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

# 수치미분함수가 있어야함
# 수치미분함수.
def numerical_derivative(f, x):

    delta_x =1e-4
    derivative_x = np.zeros_like(x) # [0.0, 0.0]

    it = np.nditer(x, flags=[&#39;multi_index&#39;])

    while not it.finished:

        idx = it.multi_index   # 현재의 index를 추출 =&gt; tuple형태로 리턴

        tmp = x[idx]    # 현재 index의 값을 일단 잠시 보존해요.
                        # 밑에서 이 값을 변경해서 중앙차분 값을 계산해야함
                        # 그런데 우리 편미분을 해야하는데 다음 변수 편미분을 할때에
                        # 원래값으로 복원해야 정상적으로 진행되기 때문에
                        # 이 값을 잠시 보관했다가 원상태로 복구해야함
        x[idx] = tmp + delta_x
        fx_plus_delta_x = f(x)   # f(x + delta_x)

        x[idx] = tmp - delta_x
        fx_minus_delta_x = f(x)

        derivative_x[idx] = (fx_plus_delta_x - fx_minus_delta_x) / (2 * delta_x)

        x[idx] = tmp

        it.iternext()
    return derivative_x

# Raw Data Loading
df = pd.read_csv(&#39;/content/drive/MyDrive/Colab Notebooks/ML/data/ozone/ozone.csv&#39;)
# display(df)

# 아직은 simple linear regression 얘기를 하는 중이기 때문에
# 독립변수를 1개만 사용할것. ==&gt; Temp
# 종속변수는 Ozone을 사용

# 그러면 먼저 사용할 데이터를 추출해보자
training_data = df[[&#39;Temp&#39;, &#39;Ozone&#39;]]
# display(training_data)   # 153 rows × 2 columns

# 데이터 처리를 좀 해야함
# 결측치 처리를 해야함
# 이런 결측치 처리하는 방식이 두가지 있음
# 1. 결측치 삭제
#    데이터량이 충분히 많을때 삭제
#    일반적으로 총 데이터가 10만개를 기준으로 데이터가 많고 적음을 삼음
#
# 2. 결측치 대체 =&gt; imputation 진행
#    데이터량이 충분하지 않은경우
#    그럼 어떤값으로 대체하는가 =&gt; 평균 중위 최빈
#
# 머신러닝을 이용해서 값을 대체

# 삭제해서 사용해보자
training_data = training_data.dropna(how=&#39;any&#39;)
display(training_data)   # 116 rows × 2 columns</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[11.28 AI & ML]]></title>
            <link>https://velog.io/@m1ng_9/11.28-AI-ML</link>
            <guid>https://velog.io/@m1ng_9/11.28-AI-ML</guid>
            <pubDate>Tue, 05 Dec 2023 12:56:37 GMT</pubDate>
            <description><![CDATA[<h1 id="ai">AI</h1>
<p>AI를 구현하는 방법에는 여러가지가 존재합니다.
<img src="https://velog.velcdn.com/images/m1ng_9/post/5d9555c6-f756-4cb6-9843-b25c138ba8a0/image.png" alt="">
우리는 이 중에서 머신러닝(Mechine Learning 통칭 ML)에 대해 이야기를 하고자 합니다.</p>
<hr>
<h1 id="mlmechine-learning">ML(Mechine Learning)</h1>
<h3 id="프로그래밍-방식">프로그래밍 방식</h3>
<p>먼저 기존 <code>프로그래밍</code> 방식은 <code>Rule-based</code> 방식으로 규칙에 기반한 방식으로 프로그래밍이 됩니다.
<img src="https://velog.velcdn.com/images/m1ng_9/post/201a3d73-ab14-4eac-95fe-1ad9bc4bba90/image.png" alt=""></p>
<p><code>Data(입력)</code> =&gt; <code>함수</code>와 <code>Method</code>를 통한 <code>로직처리</code> =&gt;<code>해답(출력)</code>을 하게 됩니다.</p>
<h3 id="머신러닝-방식">머신러닝 방식</h3>
<p>그에 반해 <code>머신러닝</code>은 다른 방식을 사용하게 됩니다.
<img src="https://velog.velcdn.com/images/m1ng_9/post/e500a3f9-98f5-4e7d-87a8-a5318784673d/image.png" alt="">
<code>Data,해답(입력)</code> 모두 입력 데이터에 같이 들어가게 되고,
<code>학습</code>에서는 Query를 통과 후 <code>규칙성</code>을 출력하게 됩니다.
이 규칙성이 인공지능에서 필요한 <code>Model</code>이 생성되게 됩니다.
이 <code>Model</code>은 수식으로 표현이 되고 다른말로는 <code>Prediction</code> 예측이라고도 합니다.
<img src="https://velog.velcdn.com/images/m1ng_9/post/236719f4-9cae-49d4-8fb4-f1d07d513555/image.png" alt="">
한 줄로 표현하자면 <code>입력</code>안에는 <code>Data와 해답</code>이 모두 존재하고 이것을 <code>학습</code>을 진행 =&gt; 데이터를 일반화하는 <code>Model</code>이 생성되게 됩니다.
여기서 학습이란 =&gt; 데이터와 정답간의 규칙성을 찾아내는 작업입니다.</p>
<hr>
<h1 id="ml과-dl">ML과 DL</h1>
<p>흔히 우리가 말하는 <code>딥러닝 Deep Learning(DL)</code>은 크게 머신러닝안에 포함되어 있습니다.
ML과 DL의 차이점은 Data의 특성이 다르다는 것입니다.
ML은 <code>정형 데이터</code>를 사용하고
DL은 <code>비정형 데이터</code>를 사용하게 됩니다.
<img src="https://velog.velcdn.com/images/m1ng_9/post/cc24ee28-1db4-4eaf-a060-fe49b44b25f1/image.png" alt=""></p>
<hr>
<h2 id="머신러닝-알고리즘">머신러닝 알고리즘</h2>
<p>머신러닝의 알고리즘에는 다양한 많은 것들이 존재합니다
<img src="https://velog.velcdn.com/images/m1ng_9/post/814b5e5a-55bf-447a-92f6-a40c02504aaf/image.png" alt=""></p>
<ul>
<li>Regression<ul>
<li>회귀로 여러가지가 존재한다.</li>
</ul>
</li>
<li>SVM(Support Vector Mechine) <code>서포트 벡터 머신</code><ul>
<li>패턴 인식, 자료 분석을 위한 지도 학습 모델이며, 주로 분류와 회귀 분석을 위해 사용한다</li>
</ul>
</li>
<li>Decision Tree <code>의사결정 트리</code> (앙상블 기법 적용 -&gt; Random Forest)<ul>
<li>의사결정나무는 분류(classification)와 회귀(regression) 모두 가능합니다</li>
</ul>
</li>
<li><h2 id="naive-bayes-나이브-베이즈">Naive Bayes <code>나이브 베이즈</code></h2>
</li>
<li>KNN(K - Nearest Neighbors) <code>K-최근접 이웃</code></li>
<li>ANN(Artificial Neural Network) <code>인공 신경망</code> =&gt; Deep Learning에 주로 사용</li>
<li>Clustering (K-Means, DBscan) =&gt; 비지도학습</li>
<li>Reinforcement Learning <code>강화학습</code></li>
</ul>
<h2 id="머신러닝-타입">머신러닝 타입</h2>
<p><img src="https://velog.velcdn.com/images/m1ng_9/post/ead0dbe3-4b47-4158-a9d9-cba8ecb7bae5/image.png" alt=""></p>
<ul>
<li><ol>
<li>지도학습(Supervised learning)</li>
</ol>
<ul>
<li>데이터와 정답이 같이 입력으로 들어갑니다.</li>
</ul>
</li>
<li><ol start="2">
<li>비지도 학습(Unsupervised learning)</li>
</ol>
<ul>
<li>데이터만 입력으로 들어감 =&gt; clustering 과정을 거침</li>
</ul>
</li>
<li><ol start="3">
<li>준지도학습(Semisupervised learning)</li>
</ol>
<ul>
<li>지도학습과 비지도학습을 합친것</li>
</ul>
</li>
<li><ol start="4">
<li>강화학습(Reinforcement Learning)
```</li>
</ol>
</li>
<li>데이터<ul>
<li>입력데이터</li>
<li>X_data</li>
<li>독립변수</li>
<li>Feature</li>
</ul>
</li>
<li>정답<ul>
<li>label</li>
<li>target</li>
<li>T_data</li>
<li>종속변수<pre><code>## 지도학습(Supervised Learning)
![](https://velog.velcdn.com/images/m1ng_9/post/23f30747-ca5d-4d8d-a174-e1923ed6b74d/image.png)
지도학습은 `Data(독립변수)` + `정답(종속변수)`이 입력값이다
이 입력값을 위의 그림처럼 학습을 반복하여 규칙성을 찾아낸다.
이 규칙성이 `Model`이며 최종적으로 모델이 저장된다.
</code></pre></li>
</ul>
</li>
</ul>
<p>여기서 Target의 형태는 두가지로 나뉜다.</p>
<ul>
<li><ol>
<li>연속적인 숫자값일때 =&gt; (Linear Regression)</li>
</ol>
</li>
<li><ol start="2">
<li>이산적인 분류값일때 =&gt; (Classification)</li>
</ol>
</li>
</ul>
<hr>
<h1 id="회귀regression">회귀(Regression)</h1>
<p><img src="https://velog.velcdn.com/images/m1ng_9/post/dd2644eb-5dd0-4f1f-9074-0cbc8e3fb1d2/image.png" alt=""></p>
<ul>
<li>회귀 : 어떤 데이터에 대해 그 데이터에 영향을 주는 조건들의 평균적인 영향력을 이용해서 데이터에 대한 <code>조건부 평균</code>을 구하는 기법이다.
==&gt; 아주 간단하게 생각하면 회귀는 <code>평균</code>을 구하는 기법이다.</li>
</ul>
<h2 id="회귀-예시">회귀 예시</h2>
<p>예를 들어보겠습니다.</p>
<pre><code>ex) 우리나라의 아파트 시세가 얼마인지 조사 -&gt; 아파트 시세를 나타내기위한 대표값은 어떤게 적절할까?
평균, 최대, 최소, 중위, 최빈 값을 사용한다.

ex) 우리나라의 아파트 시세가 얼마인지 조사 -&gt; 아파트 시세를 나타내기위한 대표값은 어떤게 적절할까?
산출평균으로 계산한다 ==&gt; `1억`

아파트 가격에 영향을 주는 요인이 굉장히 많습니다.
ex) 평수, 연식, 학군, 지역, 층수, 방향, 역세권 등등</code></pre><p>조금 더 자세하게 특정 조건에 따른 가격 변화(면적)를 보겠습니다.
<img src="https://velog.velcdn.com/images/m1ng_9/post/dffc8944-8006-4aff-af84-61633297896b/image.png" alt="">
가격이 파란색 점으로 형성되어있다고 가정하면 면적의 평균은 빨간색 점이다.
여기서 점은 예를 들어 328만원 * 평형 + 3400만원 이라고 가정하면
328만원(가중치) 평형(조건) 3400만원(bias)라고 표현할 수 있다.</p>
<p>아파트 가격은 조건에 따라 또 추가가 되기 때문에 여러 요인들을 더해야합니다.
<img src="https://velog.velcdn.com/images/m1ng_9/post/d2f281a7-5b37-4776-8526-d5901221d403/image.png" alt="">
아파트 가격 = 340<em>(평형) + 500</em>(화장실 개수) + 700*(역세권여부) + 2500
여기서 340, 500, 700은 가중치(W) 평형, 화장실 개수, 역세권 여부는 조건 2500은 bias로 표현할 수 있다.</p>
<p>즉 회귀란 어떤 <strong>데이터(아파트 가격)</strong>에 대해 그 데이터에 영향을 주는 <strong>조건(평형,지역,학군)</strong>들의 평균적인 <strong>영향력(가중치)</strong>를 이용해서 데이터에 대한 <strong>조건부 평균</strong>을 구하는 기법이다.</p>
<h2 id="회귀-그래프">회귀 그래프</h2>
<p>여기서 우리가 구하고 싶은건 가중치(W), 보정치(Bias)이다.
단순화시켜서 생각을 하게 되면 독립변수가 한개일때는 아래와 같은 직선식이 그려지게 된다.
<img src="https://velog.velcdn.com/images/m1ng_9/post/af449474-d6ad-4636-9d0d-c68542a3a312/image.png" alt=""></p>
<h2 id="회귀를-할때-알아두어야하는-사항">회귀를 할때 알아두어야하는 사항</h2>
<ol>
<li><p>회귀는 평균적으로 평균을 구하는 기법이다.</p>
<ul>
<li><ol>
<li>우리나라 근로자의 연봉 =&gt; 대체적으로 살짝 기울여진 그래프
<img src="https://velog.velcdn.com/images/m1ng_9/post/31395bb0-c322-4971-9f1e-242ca7037ec2/image.png" alt=""></li>
</ol>
</li>
<li><ol start="2">
<li>우리나라 성인 남자의 키 =&gt; 정규분포와 비슷한 모양의 그래프
<img src="https://velog.velcdn.com/images/m1ng_9/post/93a5c79d-d932-46d3-92f6-3ecb3b6bfee7/image.png" alt=""></li>
</ol>
</li>
</ul>
</li>
<li><p>Regression toward the mean</p>
<ul>
<li>많은 자료를 토대로 결과를 예측할 때 그 결과 값이 평균에 가까워지려는 경향성을 가진다. </li>
<li>이것은 상관이 완전하지 않은 관게에서도 볼 수 있는 특성이다. </li>
</ul>
</li>
<li><p>종속변수의 개수에 따라 모델이 달라집니다.</p>
<ul>
<li>단변량 회귀모델</li>
<li>다변량 회귀모델</li>
<li>기본적으로 회귀분석은 <strong>단변량</strong>을 가정하고 있습니다.</li>
</ul>
</li>
<li><p>굉장히 많은 회귀 모델의 종류가 존재합니다.</p>
<ul>
<li>그 중에서 우리가 사용하고 연습할 모델은 가장 기본적인 모델인
Classical Linear Regression Model이고 일반식은 아래와 같습니다.<img src="https://velog.velcdn.com/images/m1ng_9/post/f97a4845-3d9a-44d8-a86d-2bf2294e856d/image.png" alt=""></li>
</ul>
</li>
</ol>
<hr>
<h1 id="파이썬-구현">파이썬 구현</h1>
<h2 id="파이썬-수치-미분-코드">파이썬 수치 미분 코드</h2>
<pre><code class="language-python"># 일변수 함수의 수치미분 코드 구현
# 입력으로 함수를 받아서 미분을 수행하는 함수를 하나 구현해 봅시다!
# 우리 파이썬은 일급함수를 지원합니다!
# 함수의 인자로 다른 함수를 받을 수 있습니다.

def numerical_derivative(f, x):

    # 입력인자 f는 미분하려는 함수
    # 입력인자 x는 미분값을 알고자하는 입력값.

    delta_x = 1e-4

    # 중앙차분을 이용한 미분을 코드로 표현해봅시다!
    result = (f(x + delta_x) - f(x - delta_x)) / (2 * delta_x)
    return result

# 이 미분함수가 정상적으로 값을 계산하는지 확인해 봅시다!

def my_func(x):
    return x**2

# 함수 f(x) = x**2의 미분계수 f&#39;(5)를 구해봅시다!

result = numerical_derivative(my_func, 5)
print(result)  # 9.999999999976694</code></pre>
<hr>
<pre><code class="language-python"># 다변수 함수의 수치미분 코드를 구현해보아요!

# f(x,y)=2x+3xy+y^3제곱
# x에 대해 편미분 =&gt; 2+3^y
# y에 대해 편미분 -&gt; 3 + 3y^2
# f&#39;(1.0, 2.0)=?
# x에 대해 미분이기에 x자리의 값은 x에 대한 편미분
# y도 마찬가지
# 각각 집어넣게되면 (8.0, 15.0)이 나옴
import numpy as np

def numerical_derivative(f, x): # x가 다변수함수이기때문에 2개가 들어가야함

    # f: 미분하려고하는 다변수 함수
    # x: 모든 변수를 포함하는 ndarray [1.0, 2.0] ==&gt; 2변수
    # 미분의 결과는 [8.0, 15.0]이 나와야함.

    delta_x =1e-4
    derivative_x = np.zeros_like(x) # [0.0, 0.0]

    it = np.nditer(x, flags=[&#39;multi_index&#39;])

    while not it.finished:

        idx = it.multi_index   # 현재의 index를 추출 =&gt; tuple형태로 리턴

        tmp = x[idx]    # 현재 index의 값을 일단 잠시 보존해요.
                        # 밑에서 이 값을 변경해서 중앙차분 값을 계산해야함
                        # 그런데 우리 편미분을 해야하는데 다음 변수 편미분을 할때에
                        # 원래값으로 복원해야 정상적으로 진행되기 때문에
                        # 이 값을 잠시 보관했다가 원상태로 복구해야함
        x[idx] = tmp + delta_x
        fx_plus_delta_x = f(x)   # f(x + delta_x)

        x[idx] = tmp - delta_x
        fx_minus_delta_x = f(x)

        derivative_x[idx] = (fx_plus_delta_x - fx_minus_delta_x) / (2 * delta_x)

        x[idx] = tmp

        it.iternext()
    return derivative_x

def my_func(x):

    return x**2

# f&#39;(3.0)을 구해보아요!

result = numerical_derivative(my_func, np.array([3.0]))
print(result)    # 6</code></pre>
<hr>
<pre><code class="language-python"># 2변수 함수를 다시 만들어보아요!

def my_func(input_data):

    x = input_data[0]
    y = input_data[1]

    # f(x) = 2x + 3xy + y^3
    return 2*x + 3*x*y + np.power(y,3)

result = numerical_derivative(my_func, np.array([1.0, 2.0]))
print(result)   # [ 8.    15.00000001]</code></pre>
<hr>
<pre><code class="language-python"># 4변수 함수에 대해서 수치미분을 해보세요
def my_func(input_data):
    w = input_data[0,0]
    x = input_data[0,1]
    y = input_data[1,0]
    z = input_data[1,1]

    # f(x)=2x+3xy+y^3
    return w*x + x*y*z + 3*w + z*np.power(y,2)


data = np.array([[1.0, 2.0],
                 [3.0, 4.0]])
result = numerical_derivative(my_func, data)   # np.array가 들어가야하니까 아예 np.array로 리스트를 생성해서 만듬
print(result)   # [[ 5. 13.]
                # [32. 15.]]</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Velog(벨로그) 사용방법]]></title>
            <link>https://velog.io/@m1ng_9/Velog%EB%B2%A8%EB%A1%9C%EA%B7%B8-%EC%82%AC%EC%9A%A9%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@m1ng_9/Velog%EB%B2%A8%EB%A1%9C%EA%B7%B8-%EC%82%AC%EC%9A%A9%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Mon, 04 Dec 2023 07:56:27 GMT</pubDate>
            <description><![CDATA[<h1 id="🗒-마크다운이란">🗒 마크다운이란?</h1>
<blockquote>
<p>마크다운(markdown)은 일반 텍스트 기반의 경량 마크업 언어다. 일반 텍스트로 서식이 있는 문서를 작성하는 데 사용되며, 일반 마크업 언어에 비해 문법이 쉽고 간단한 것이 특징이다. HTML과 리치 텍스트(RTF) 등 서식 문서로 쉽게 변환되기 때문에 응용 소프트웨어와 함께 배포되는 README 파일이나 온라인 게시물 등에 많이 사용된다.
-위키백과 </p>
</blockquote>
<ul>
<li>쉽게 읽을 수 있고, 쉽게 작성 할 수 있게 만들어졌음.</li>
<li>README나 온라인 게시물에 많이 사용됨.</li>
</ul>
<h2 id="1-제목header">1. 제목(Header)</h2>
<p><code>h1</code>부터 <code>h6</code>까지 표현 할 수 있고, #의 개수로 표현이 가능합니다
🖊 마크다운으로 작성 시</p>
<pre><code># h1
## h2
### h3
#### h4
##### h5
###### h6</code></pre><p>✔결과</p>
<h1 id="h1">h1</h1>
<h2 id="h2">h2</h2>
<h3 id="h3">h3</h3>
<h4 id="h4">h4</h4>
<h5 id="h5">h5</h5>
<h6 id="h6">h6</h6>
<h3 id="h1-h2는-다른-방법으로도-작성이-가능합니다">h1, h2는 다른 방법으로도 작성이 가능합니다</h3>
<p><code>=</code>,<code>-</code>를 각각 2개 이상 사용하면 아래와 같이 <code>h1</code>, <code>h2</code>의 <code>#</code>을 대체할 수 있습니다.
여러개를 사용해도 마찬가지입니다.</p>
<p>🖊 마크다운으로 작성 시 </p>
<pre><code>h1
==
h2
--

하이픈을 여러 개 사용한 제목
-------------------</code></pre><p>✔ 결과
h1
==
h2
--</p>
<h2 id="하이픈을-여러-개-사용한-제목">하이픈을 여러 개 사용한 제목</h2>
<hr>
<h2 id="2-문단-간격">2. 문단 간격</h2>
<p>문단의 간격은 <code>줄 바꿈</code>으로 나타내고, 여러 번 <code>줄 바꿈</code>시 <code>&lt;br/&gt;</code>을 사용하면 가능합니다.
<code>&lt;br/&gt;</code>은 html에서 사용하는 문법입니다.
🖊 마크다운으로 작성 시</p>
<pre><code>첫 번째 문단 &lt;br/&gt;&lt;br/&gt;
두 번째 문단 &lt;br/&gt;
세 번째 문단</code></pre><p>✔ 결과
첫 번째 문단 <br/><br/>
두 번째 문단 <br/>
세 번째 문단</p>
<hr>
<h2 id="3-목록">3. 목록</h2>
<p>순서를 표기하는 목록 / 순서가 없는 목록 두 가지를 작성할 수 있습니다.</p>
<h3 id="31-순서를-표기하는-목록">3.1 순서를 표기하는 목록</h3>
<p><code>숫자</code>와 <code>.</code>을 사용하여 작성합니다.
🖊 마크다운으로 작성 시</p>
<pre><code>1. first
2. second
3. thrid</code></pre><p>✔ 결과</p>
<ol>
<li>first</li>
<li>second</li>
<li>thrid</li>
</ol>
<hr>
<h3 id="32-순서가-없는-목록">3.2 순서가 없는 목록</h3>
<p><code>-</code>, <code>*</code>, <code>+</code> 사용하여 작성합니다 (셋 다 동일하게 적용 됨)
<code>inline code, block code</code>를작성 할 수 있으며, <code>Tab</code>키나 <code>Space bar</code>를 이용해 들여쓰기가 가능합니다.
🖊 마크다운으로 작성 시</p>
<pre><code>- 순서가 없는 목록 1
    - 목록 1.1
        - 목록 1.2
        - 목록 1.3
- 순서가 없는 목록 2

        Tab 두번 하면 `code block`을 만들 수 있습니다.
 * 순서가 없는 목록 3
 * 순서가 없는 목록 4
     + `inline code`
        - 들여쓰기(Tab 키를 이용)를 하면 다른 모양으로 표현됩니다.

        ```
        block code
        ```</code></pre><p>✔ 결과</p>
<ul>
<li><p>순서가 없는 목록 1</p>
<ul>
<li>목록 1.1<ul>
<li>목록 1.2</li>
<li>목록 1.3</li>
</ul>
</li>
</ul>
</li>
<li><p>순서가 없는 목록 2</p>
<pre><code>  Tab 두번 하면 `code block`을 만들 수 있습니다.</code></pre><ul>
<li><p>순서가 없는 목록 3</p>
</li>
<li><p>순서가 없는 목록 4</p>
<ul>
<li><p><code>inline code</code></p>
<ul>
<li><p>들여쓰기(Tab 키를 이용)를 하면 다른 모양으로 표현됩니다.</p>
<pre><code>block code</code></pre></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<h2 id="4-폰트-스타일">4. 폰트 스타일</h2>
<p>굵기, 기울기, 취소선, 등 기본적은 스타일을 아래와 같이 작성 가능합니다.
🖊 마크다운으로 작성 시</p>
<pre><code>__굵게__
**굵게**
_기울여 쓰기_
*기울여 쓰기*
~취소선~
~~취소선~~</code></pre><p>✔ 결과
<strong>굵게</strong>
<strong>굵게</strong>
<em>기울여 쓰기</em>
<em>기울여 쓰기</em>
<del>취소선</del>
<del>취소선</del></p>
<hr>
<h2 id="5-인용문">5. 인용문</h2>
<p>인용문을 작성할 때에는 <code>&gt;</code>을 사용합니다.
🖊 마크다운으로 작성 시</p>
<pre><code>&gt; 인용문 작성하기
-작성자

&gt; 인용문 작성하기
&gt;&gt; (&gt;)의 갯수에 따라
&gt;&gt;&gt; 중첩문 가능</code></pre><p>✔ 결과</p>
<blockquote>
<p>인용문 작성하기
-작성자</p>
</blockquote>
<blockquote>
<p>인용문 작성하기</p>
<blockquote>
<p>(&gt;)의 갯수에 따라</p>
<blockquote>
<p>중첩문 가능</p>
</blockquote>
</blockquote>
</blockquote>
<hr>
<h2 id="6-inline-code">6. inline code</h2>
<p><code>백틱(</code>)`을사용하여 inline code를 작성할 수 있습니다.
🖊 마크다운으로 작성 시</p>
<pre><code>`inline code는 이렇게 작성해요.`</code></pre><p>✔ 결과
<code>inline code는 이렇게 작성해요</code></p>
<hr>
<h2 id="7-여러-줄로-된-code-block">7. 여러 줄로 된 code block</h2>
<p><code>```</code>백틱 3개를 사용시 띄어쓰기를 확실하게 하여 code block 설정을 제대로 해야합니다.
🖊 마크다운으로 작성 시</p>
<pre><code>    ```
    위 아래 3개로 감싸면 block으로 만들 수 있어요.
    ```</code></pre><p>✔ 결과</p>
<pre><code>위 아래 3개로 감싸면 block으로 만들 수 있어요.</code></pre><p>💡 코드 하이라이트
🖊 마크다운으로 작성 시</p>
<pre><code>```아래와 같이 백틱 3개 뒤에 언어 이름을 넣어주세요
```python
num_list = [&#39;one&#39;, &#39;two&#39;, &#39;three&#39;]
for num in num_list:
  print(num)</code></pre><pre><code></code></pre><p>✔ 결과</p>
<pre><code class="language-python">num_list = [&#39;one&#39;, &#39;two&#39;, &#39;three&#39;]
for num in num_list:
  print(num)</code></pre>
<hr>
<h2 id="8-링크link">8. 링크(link)</h2>
<p>inline 링크와 url 링크, 참조 링크 나타낼 수 있습니다.
🖊 마크다운으로 작성 시</p>
<pre><code>inline 링크는 아래처럼
[inline 링크](http://velog.io/)

url 링크는 아래처럼
&lt;http://velog.io/&gt;

참조 링크는 아래
[velog]:(http://velog.io/)</code></pre><p>✔ 결과
inline 링크는 아래처럼
<a href="http://velog.io/">inline 링크</a></p>
<p>url 링크는 아래처럼
<a href="http://velog.io/">http://velog.io/</a></p>
<p>참조 링크는 아래
[velog]:(<a href="http://velog.io/">http://velog.io/</a>)</p>
<hr>
<h2 id="9-수평선">9. 수평선</h2>
<p><code>*</code>이나 <code>-</code>,<code>_</code>등을 3개 이상 입력하면 작성할 수 있습니다.
띄어쓰기를 중간에 삽입하여도 가능합니다. 
다만, 하이픈<code>-</code>은 헤더로 인식할 수도 있으니 주의해서 사용할 필요가 있습니다.
🖊 마크다운으로 작성 시</p>
<pre><code>***
-------
-- -- -- -- --</code></pre><p>✔ 결과</p>
<hr>
<hr>
<hr>
<hr>
<h2 id="10-이미지-링크">10. 이미지 링크</h2>
<p>이미지 링크는 아래와 같이 작성할 수 있습니다.
🖊 마크다운으로 작성 시</p>
<pre><code>![이미지 설명](이미지 링크)
![고양이입니다](![](https://velog.velcdn.com/images/m1ng_9/post/d4245c63-3507-405e-8214-635663245101/image.png)</code></pre><p>✔ 결과
<img src="!%5B%5D(https://velog.velcdn.com/images/m1ng_9/post/d4245c63-3507-405e-8214-635663245101/image.png" alt="고양이입니다">
만약 이미지에 링크를 걸고 싶은 경우에는 아래와 같이 작성합니다</p>
<p>🖊 마크다운으로 작성 시</p>
<pre><code>[![이미지 설명](이미지 링크)](연결하고자하는 url &quot;마우스 오버 시 나타낼 링크 title&quot;)
[![고양이입니다](![](https://velog.velcdn.com/images/m1ng_9/post/d4245c63-3507-405e-8214-635663245101/image.png)](https://velog.velcdn.com/images/m1ng_9/post/d4245c63-3507-405e-8214-635663245101/image.png&quot;이미지 무료 사이트 cat&quot;)</code></pre><p>✔ 결과
[<img src="!%5B%5D(https://velog.velcdn.com/images/m1ng_9/post/d4245c63-3507-405e-8214-635663245101/image.png" alt="고양이입니다">](<a href="https://velog.velcdn.com/images/m1ng_9/post/d4245c63-3507-405e-8214-635663245101/image.png&quot;%EC%9D%B4%EB%AF%B8%EC%A7%80">https://velog.velcdn.com/images/m1ng_9/post/d4245c63-3507-405e-8214-635663245101/image.png&quot;이미지</a> 무료 사이트 cat&quot;)</p>
<p>중요 ! 이미지 크기는 <code>10MB</code> 이하만 가능합니다. (gif 포함)
사이즈 조절과 관련된 마크다운은 아직 적용이 되어있지 않은 것 같습니다.</p>
<hr>
<h2 id="11-테이블table">11. 테이블(Table)</h2>
<p>테이블은 아래와 같이 작성합니다
<code>|</code>로 구분하며 &lt;4. 폰트 스타일&gt; 에서 이야기 했던 기본적인 스타일 적용이 가능합니다
또한 <code>-(하이픈)</code>으로 구분된 곳 각각 왼쪽, 양쪽, 오른쪽 <code>:(세미콜론)</code>을 붙일 경우
순서대로 왼쪽 정렬, 가운데 정렬, 오른쪽 정렬이 가능합니다.
🖊 마크다운으로 작성 시</p>
<pre><code>| 드라마 제목 | 주연 배우 | 방영일 |
|:----------|:---------|:--------|
|**이두나!**| 수지, 양세종 | 2022년 7월 12일 ~ 2023년 2월 20일 |
| 사내 맞선 | 김세정, 안효섭 | 2022년 2월 28일 ~ 2022년 4월 5일 |</code></pre><p>✔ 결과
| 드라마 제목 | 주연 배우 | 방영일 |
|:----------|:---------|:--------|
|<strong>이두나!</strong>| 수지, 양세종 | 2022년 7월 12일 ~ 2023년 2월 20일 |
| 사내 맞선 | 김세정, 안효섭 | 2022년 2월 28일 ~ 2022년 4월 5일 |</p>
<hr>
<h2 id="12-체크박스check-box">12. 체크박스(Check Box)</h2>
<p><code>-</code>, <code>*</code>, <code>+</code> 뒤에 띄어쓰기 후 <code>대괄호</code>를 넣어 작성해주세요.
<code>대괄호</code>안에 띄어쓰기를 하면 빈 체크박스, <code>x</code>를 넣으면 체크된 체크박스가 생깁니다.
🖊 마크다운으로 작성 시</p>
<pre><code>- [ ] 운동하기
- [x] 강의 듣기</code></pre><p>✔ 결과</p>
<ul>
<li><input disabled="" type="checkbox"> 운동하기</li>
<li><input checked="" disabled="" type="checkbox"> 강의 듣기</li>
</ul>
<hr>
<h2 id="13-이모지⭐">13. 이모지⭐</h2>
<p>이모지는 트위터 이모지로 <a href="https://kr.piliapp.com/twitter-symbols/">https://kr.piliapp.com/twitter-symbols/</a>
복사 붙여넣기로 사용하시면 됩니다</p>
<h3 id="단축키">단축키</h3>
<p>window10: <code>윈도우 키</code> + <code>마침표(.)</code>
mac: <code>Command</code> + <code>Control</code> + <code>Space Bar</code></p>
<hr>
<h2 id="14-글자-색상">14. 글자 색상</h2>
<p>html 태그를 이용하여 작성이 가능합니다.
🖊 마크다운으로 작성 시</p>
<pre><code>&lt;span style=&quot;color:red&quot;&gt;red&lt;/span&gt;
&lt;span style=&quot;color:#d3d3d3&quot;&gt;#d3d3d3&lt;/span&gt;
&lt;span style=&quot;color:rgb(245, 235, 13)&quot;&gt;rgb(245, 235, 13)&lt;/span&gt;</code></pre><p>✔ 결과
<span style="color:red">red</span>
<span style="color:#d3d3d3">#d3d3d3</span>
<span style="color:rgb(245, 235, 13)">rgb(245, 235, 13)</span></p>
<hr>
<h2 id="글을-마치며">글을 마치며,</h2>
<p>velog를 시작하면서 Markdown을 작성해보았습니다.
velog는 Markdown 문법을 모두 사용하는 것이 아니기때문에
나중에 보고 사용할 수 있도록 작성해보았습니다.</p>
]]></description>
        </item>
    </channel>
</rss>