import pandas as pd
import seaborn as sns
# 원래 차트 그리는 라이브러리인데, 제공하는 데이터 셋 활용하고자 함
df = sns.load_dataset('titanic')
df
df.info()를 통해 데이터 구성과 형태를 확인한다.
독립변수(x)와 종속변수(y)가 하나의 df에 통합되어 있어 분리 추출 필요
머신러닝은 NaN값을 반드시 처리해줘야 하는데 그 방법은 값을 채워주는 것과 삭제하는 것 두 가지 방법이 있다.
NaN 값이 많은 deck는 삭제하여야 하고 embaked와 중복된 데이터를 가지는 embarked_town 역시 삭제한다.
rdf = df.drop([‘deck, ‘embarked_town’], axis =1)
#해당 데이터를 포함한 열 전체 삭제를 위해 열 기준을 부여
rdf.info()
rdf = rdf.dropna(subset=[‘age’], how=’any’, axis=0)
#여기서 how = ‘any’는 기본값
#나이 열에 NaN값이 있다면 그 값이 속한 모든 행을 삭제하라는 의미
rdf.head(150)
rdf = rdf [['survived','pclass','sex','age','sibsp','parch']]
rdf.head()
onehot_sex = pd.get_dummies(rdf['sex'])
# 컬럼 내 unique를 확인하는 절차. 2가지 성별로 이루어진 것 -> 컬럼 형태로 제공해줌
onehot_sex
ndf =pd.concat([rdf, onehot_sex], axis =1)
ndf.head()
del ndf['sex']
#이 코드도 가능하다: ndf.drop(['sex'], axis = 1, inplace =True)
X = ndf[['pclass','age', 'sibsp', 'parch', 'female', 'male']]
y = ndf['survived']
X.shape
y.shape
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 7)
X_train.shape
X_test.shape
from sklearn.neighbors import KNeighborsClassifier
clf = KNeighborsClassifier(n_neighbors=3)
#이웃에 수에 따른 정확도를 저장할 리스트 변수 선언
train_scores = []
test_scores = []
num_settings = range(1,11) #유지 보수 용이성을 위해 변수로 선언
for num_neighbor in num_settings:
#모델 생성
clf = KNeighborsClassifier(n_neighbors=num_neighbor)
clf.fit(X_train, y_train)
#훈련 세트 정확도 저장
train_scores.append(clf.score(X_train, y_train))
#테스트 세트 정확도 저장
test_scores.append(clf.score(X_test, y_test))
#예측 정확도 비교 그래프 그리기
plt.figure(dpi=100)
plt.plot(num_settings, train_scores, label='훈련 정확도')
plt.plot(num_settings, test_scores, label='테스트 정확도')
plt.ylabel('정확도')
plt.xlabel('이웃의 수')
plt.legend()
plt.show() # Sweet spot = 7
#y_test와 y_pred를 비교
#모델 설정 후 학습하기
clf = KNeighborsClassifier(n_neighbors = 7)
clf.fit(X_train, y_train)
#예측하기
y_pred = clf.predict(X_test)
from sklearn import metrics
#모델의 성능평가 지표 계산 ->accuracy(정확도), precision, recall, f1_score
print('테스트 성능평가 n_neighbors = 7')
print('accuracy: ', metrics.accuracy_score(y_test, y_pred))
print('precision: ', metrics.precision_score(y_test, y_pred))
print('recall: ', metrics.recall_score(y_test, y_pred))
print('f1: ', metrics.f1_score(y_test, y_pred))
knn_report = metrics.classification_report(y_test, y_pred)
print(knn_report)
import mglearn
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
import warnings
warnings.filterwarnings('ignore')
X, y = mglearn.datasets.make_wave(n_samples=1000)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 7)
X_train.shape
X_test.shape
lr = LinearRegression()
lr.fit(X_train, y_train)
print('lr.coef_:', lr.coef_)
# w 가중치, 기울기
# 언더바는 설정한 변수가 아닌 클래스에서 제공해주는 변수 말하는 것)
print('lr._:', lr.intercept_)
# 절편
print('훈련 세트의 R2: ', lr.score(X_train, y_train))
print('테스트 세트의 R2: ', lr.score(X_test, y_test))
결과값:
훈련 세트의 R2: 0.6066271469632917
테스트 세트의 R2: 0.6491816600811464
최소 70점 이상은 나와야 활용가능 수준
이 모델은 underfitting된 상태임(과소적합)
참고. 과대적합 예시: 훈련 세트의 R2: 1, 테스트 세트의 R2: 0.602
linearRegression() 모델이 feature의 특성을 잘 이해하지 못한 상황
-> 모델 변경해야 함(왜냐면 코드에서 설정할 수 있는 것이 없기 때문에)
지금 데이터 셋에 맞지 않는 모델인 것.
다른 특징을 살려 가중치를 주는 등 다른 설정을 가진 모델이 필요
#데이터 준비하기
X, y = mglearn.datasets.load_extended_boston()
#훈련과 테스트 데이터로 분리하기
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 7)
#모델 학습하기
lr = LinearRegression().fit(X_train, y_train)
print('lr.coef_:', lr.coef_) # w 가중치, 기울기
print('lr._:', lr.intercept_) # 절편
print('훈련 세트의 R2: ', lr.score(X_train, y_train))
print('테스트 세트의 R2: ', lr.score(X_test, y_test))
#라이브러리 임포트
from sklearn.linear_model import Ridge
ridge = Ridge().fit(X_train, y_train)
#alpha default 값 = 1.0(이미 1.0정도로 규제 받는 중)
print('훈련 세트의 R2: ', ridge.score(X_train, y_train))
print('테스트 세트의 R2: ', ridge.score(X_test, y_test))
# alpha 값만 조정하여 성능평가
ridge10 = Ridge(alpha=10).fit(X_train, y_train)
print('훈련 세트의 R2: ', ridge10.score(X_train, y_train))
print('테스트 세트의 R2: ', ridge10.score(X_test, y_test))
# alpha 값만 조정하여 성능평가
ridge001 = Ridge(alpha=0.1).fit(X_train, y_train)
print('훈련 세트의 R2: ', ridge001.score(X_train, y_train))
print('테스트 세트의 R2: ', ridge001.score(X_test, y_test))
import numpy as np
from sklearn.linear_model import Lasso
lasso = Lasso().fit(X_train, y_train)
print('테스트 세트의 R2: ', lasso.score(X_train, y_train))
print('테스트 세트의 R2: ', lasso.score(X_test, y_test))
print('학습에 사용한 특성 개수: ', np.sum(lasso.coef_!= 0))
import numpy as np
from sklearn.linear_model import Lasso
lasso001 = Lasso(alpha = 0.001).fit(X_train, y_train)
print('테스트 세트의 R2: ', lasso001.score(X_train, y_train))
print('테스트 세트의 R2: ', lasso001.score(X_test, y_test))
print('학습에 사용한 특성 개수: ', np.sum(lasso001.coef_!= 0))
lasso001.coef_
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv('/content/auto-mpg.csv', header= None) #컬럼명 없을 때 넘버링으로 대신해줘
df.columns = ['mpg','cylinders','displacement','horsepower','weight',
'acceleration','model year','origin','name']
df.head()
df.info()
df['horsepower'].unique()
# 1) ? -> np.nan 형태로 변경
df['horsepower'].replace('?', np.nan, inplace=True)
df.isna()sum()
# 2) NaN값 삭제
df.dropna(subset=['horsepower'], axis=0, inplace=True)
df['horsepower'].unique()
# 3) 데이터 타입 object -> float
df['horsepower'] = df['horsepower'].astype('float')
df.info()
X = df[['weight']] #feature
y = df[['mpg']]
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 7)
X_train.shape
X_test.shape
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(X_train, y_train)
print('훈련 세트의 R2: ', lr.score(X_train, y_train))
print('테스트 세트의 R2: ', lr.score(X_test, y_test))
결과값:
훈련 세트의 R2: 0.6874675811766633
테스트 세트의 R2: 0.702814782084018
릿지회귀함수
from sklearn.linear_model import Ridge
ridge = Ridge().fit(X_train, y_train)
print('훈련 세트의 R2: ', ridge.score(X_train, y_train))
print('테스트 세트의 R2: ', ridge.score(X_test, y_test))
결과값:
훈련 세트의 R2: 0.6874675811766633
테스트 세트의 R2: 0.7028147827762304
라쏘회귀함수
from sklearn.linear_model import Lasso
lasso = Lasso().fit(X_train, y_train)
print('테스트 세트의 R2: ', lasso.score(X_train, y_train))
print('테스트 세트의 R2: ', lasso.score(X_test, y_test))
print('학습에 사용한 특성 개수: ', np.sum(lasso.coef_!= 0))
참고. 릿지와 라쏘 모델을 이용하여 예측할 때 알파값을 조정할 수 있는데, 무작위를 알파값을 넣는 것보다 그래프를 그려보고 그 훈련 및 테스트 정확도의 추이를 확인한 후에 범위를 좁혀 조정하는 것이 효율적이다.
#릿지 최적의 알파값 확인
train_scores = []
test_scores = []
alpha = np.arange(0.0001, 100, 0.001) # 유지 보수 용이성을 위해 변수로 선언
for n in alpha:
# 모델 생성 및 학습
ridge = Ridge(alpha=n).fit(X_train, y_train)
# 훈련 세트 정확도 저장
train_scores.append(ridge.score(X_train, y_train))
# 테스트 세트 정확도 저장
test_scores.append(ridge.score(X_test, y_test))
# 예측 정확도 비교 그래프 그리기
plt.figure(dpi=100)
plt.plot(alpha, train_scores, label='훈련 정확도')
plt.plot(alpha, test_scores, label='테스트 정확도')
plt.ylabel('정확도')
plt.xlabel('알파 값')
plt.legend()
plt.show()
#라쏘 최적의 알파값 확인
train_scores = []
test_scores = []
alpha = np.arange(0.0001, 1, 0.001) # 유지 보수 용이성을 위해 변수로 선언
for n in alpha:
# 모델 생성 및 학습
lasso = Lasso(alpha=n).fit(X_train, y_train)
# 훈련 세트 정확도 저장
train_scores.append(lasso.score(X_train, y_train))
# 테스트 세트 정확도 저장
test_scores.append(lasso.score(X_test, y_test))
# 예측 정확도 비교 그래프 그리기
plt.figure(dpi=150)
plt.plot(alpha, train_scores, label='훈련 정확도')
plt.plot(alpha, test_scores, label='테스트 정확도')
plt.ylabel('정확도')
plt.xlabel('알파 값')
plt.legend()
plt.show()
또한 max(train_scores) 나 max(test_scores)로 최대 정확도를 수치로 확인가능하다.