#라이브러리 임포트
import mglearn
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.svm import LinearSVC
import warnings
warnings.filterwarnings('ignore')
plt.rc('font', family ='NanumBarunGothic')
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['figure.dpi'] = 100
X, y = mglearn.datasets.make_forge()
fig, axes = plt.subplots(1, 2, figsize=(10, 3))
for model, ax in zip([LinearSVC(max_iter=5000), LogisticRegression()], axes):
#()안에는 규제 관련 디폴트 값이 들어있는데 일반적으로 잘 기능하는 값이 들어가있다. 먼저 기본을 돌리고 규제 변경해서 적용한다.
clf = model.fit(X, y)
mglearn.plots.plot_2d_separator(clf, X, fill=False, eps=0.5,
ax=ax, alpha=.7)
mglearn.discrete_scatter(X[:, 0], X[:, 1], y, ax=ax)
ax.set_title(clf.__class__.__name__)
ax.set_xlabel("특성 0")
ax.set_ylabel("특성 1")
axes[0].legend()
plt.show()
subplot이라는 함수가 두개의 차트를 그리게 되어 있어서 fig, axes로 받았다. 만약 fig를 사용하지 않을 것이라면 언더스코어로도 사용 가능
예시). _, axes = plt.subplots...
'1, 2'은 행=1 열=2의 구조로 두개 차트 배치
기존에는 for문을 작성할 때 한 개의 변수만을 사용했다면 저 위의 for문처럼 반점을 기준으로 두 개의 변수를 사용할 수 있다.
다른 설정 값은 추가 공부가 필요함:(
로지스틱 회귀 모델이 아래쪽 세모 값을 최대한 제대로 분류하고자 결정경계를 세모에 바짝 붙여 그린 것을 확인할 수 있다.
mglearn.plots.plot_linear_svc_regularization()
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
# 데이터 가져오기
cancer = load_breast_cancer()
# 데이터 분리하기
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target,
stratify = cancer.target, random_state = 7)
cancer.data.shape
X_train.shape # 75%
X_test.shape # 25%
y_train.shape
y_test.shape
from sklearn.linear_model import LogisticRegression
logreg = LogisticRegression() # C = 1
logreg.fit(X_train, y_train)
print('logreg 훈련 세트 점수: {:.8f}'.format(logreg.score(X_train, y_train)))
print('logreg 테스트 세트 점수: {:.8f}'.format(logreg.score(X_test, y_test)))
# 규제 디폴트 값
print('----------------규제기본-----------------')
logreg = LogisticRegression().fit(X_train, y_train)
print('logreg 훈련 세트 점수: {:.8f}'.format(logreg.score(X_train, y_train)))
print('logreg 테스트 세트 점수: {:.8f}'.format(logreg.score(X_test, y_test)))
# 규제 강화
print('----------------규제강화-----------------')
logreg001 = LogisticRegression(C=0.01).fit(X_train, y_train)
print('logreg001 훈련 세트 점수: {:.8f}'.format(logreg001.score(X_train, y_train)))
print('logreg001 테스트 세트 점수: {:.8f}'.format(logreg001.score(X_test, y_test)))
# 규제 완화
print('----------------규제완화-----------------')
logreg100 = LogisticRegression(C=100).fit(X_train, y_train)
print('logreg100 훈련 세트 점수: {:.8f}'.format(logreg100.score(X_train, y_train)))
print('logreg100 테스트 세트 점수: {:.8f}'.format(logreg100.score(X_test, y_test)))
# L2 규제에 대한 feature들의 가중치를 확인
plt.plot(logreg100.coef_.T, '^', label="C=100")
plt.plot(logreg.coef_.T, 'o', label="C=1")
plt.plot(logreg001.coef_.T, 'v', label="C=0.01")
plt.xticks(range(cancer.data.shape[1]), cancer.feature_names, rotation=90)
xlims = plt.xlim()
plt.hlines(0, xlims[0], xlims[1])
plt.xlim(xlims)
plt.ylim(-5, 5)
plt.xlabel("특성")
plt.ylabel("계수 크기")
plt.legend()
plt.show()
# 모델의 해석이 중요한 요소 일때도 규제 L1을 사용하며 몇가지 특성만 사용하므로
# 해당 모델에 중요한 특성이 무엇이고 효과가 어느 정도인지 설명하기 쉬움
# 규제 디폴트 값
print('----------------규제기본-----------------')
logreg = LogisticRegression(penalty='l1',solver='liblinear').fit(X_train, y_train)
print('logreg 훈련 세트 점수: {:.8f}'.format(logreg.score(X_train, y_train)))
print('logreg 테스트 세트 점수: {:.8f}'.format(logreg.score(X_test, y_test)))
# 규제 강화
print('----------------규제강화-----------------')
logreg001 = LogisticRegression(C=0.01, penalty='l1', solver='liblinear').fit(X_train, y_train)
print('logreg001 훈련 세트 점수: {:.8f}'.format(logreg001.score(X_train, y_train)))
print('logreg001 테스트 세트 점수: {:.8f}'.format(logreg001.score(X_test, y_test)))
# 규제 완화
print('----------------규제완화-----------------')
logreg100 = LogisticRegression(C=100, penalty='l1', solver='liblinear').fit(X_train, y_train)
print('logreg100 훈련 세트 점수: {:.8f}'.format(logreg100.score(X_train, y_train)))
print('logreg100 테스트 세트 점수: {:.8f}'.format(logreg100.score(X_test, y_test)))
# L1 규제에 대한 feature들의 가중치를 확인
plt.plot(logreg100.coef_.T, '^', label="C=100")
plt.plot(logreg.coef_.T, 'o', label="C=1")
plt.plot(logreg001.coef_.T, 'v', label="C=0.01")
plt.xticks(range(cancer.data.shape[1]), cancer.feature_names, rotation=90)
xlims = plt.xlim()
plt.hlines(0, xlims[0], xlims[1])
plt.xlim(xlims)
plt.ylim(-5, 5)
plt.xlabel("특성")
plt.ylabel("계수 크기")
plt.legend()
plt.show()
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
df = sns.load_dataset('titanic')
df.head()
df.info()
df['survived'].value_counts()
df['survived'].value_counts().plot.pie(autopct='%.2f')
df['survived'].value_counts().plot.barh()
attrs = df.columns
plt.figure(figsize=(20,20), dpi=100)
for i, feature in enumerate(attrs):
plt.subplot(5,5,i+1)
sns.countplot(data=df, x=feature, hue='survived')
sns.despine()
attrs = ['survived','pclass','sibsp','parch','sex','embarked']
plt.figure(figsize=(14,12), dpi=100)
for i, feature in enumerate(attrs):
plt.subplot(3,3,i+1)
sns.countplot(data=df, x=feature, hue='survived')
sns.despine()
df.isna().sum()
rdf = df.drop(['deck','embark_town'], axis=1)
rdf.info()
rdf = rdf.dropna(subset=['age'], how='any', axis =0) #NaN값만 삭제하므로 dropna
rdf.info()
most_freq = rdf['embarked'].value_counts(dropna=True)
most_freq
rdf['embarked'].fillna(most_freq, inplace=True)
rdf.isna().sum()
rdf['embarked'].fillna(most_freq, inplace=True)
rdf.isna().sum()
ndf = rdf[['survived','pclass','sex', 'age','sibsp','parch','embarked']]
ndf.info()
ndf.head()
# 6-1) 원핫 인코딩 만들기
onehot_sex = pd.get_dummies(ndf['sex'])
onehot_embarked = pd.get_dummies(ndf['embarked'])
# 6-2) ndf 데이터프레임에 연결
ndf = pd.concat([ndf, onehot_sex], axis = 1)
ndf = pd.concat([ndf, onehot_embarked], axis = 1)
ndf.drop(['sex', 'embarked'], axis = 1, inplace = True)
ndf.head()
X = ndf[['pclass', 'age', 'sibsp', 'parch', 'female','male', 'C', 'Q', 'S']]
y = ndf[['survived']]
# X (feature, 독립변수, 문제지) 값을 정규화
from sklearn import preprocessing
X = preprocessing.StandardScaler().fit(X).transform(X)
X
#train, test set으로 분리(7:3)
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, stratify = y, random_state = 7)
print('train shape', X_train.shape)
print('test shape', X_test.shape)
from sklearn import svm
svm_model =svm.SVC(kernel = 'rbf')
svm_model.fit(X_train, y_train)
print('logreg 훈련 세트 점수: {:.8f}'.format(svm_model.score(X_train, y_train)))
print('logreg 테스트 세트 점수: {:.8f}'.format(svm_model.score(X_test, y_test)))
from sklearn import metrics
y_pred = svm_model.predict(X_test)
# 모델의 성능평가 지표 계산 ->accuracy(정확도), precision, recall, f1_score
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))