데이터 소개¶
Steel Plates Faults 데이터는 1941개의 샘플을 가지며 아래의 종속변수들과 나머지 설명변수들로 구성됩니다.
종속변수 (7개) - 어떠한 불량이 나타났는지를 나타내고, 다음과 같습니다.
- Pastry, Z_Scratch, K_Scatch, Stains, Dirtiness, Bumps, Other_Faults
설명변수 (27개) - 철판의 길이, 반짝이는 정도, 두께, 타입 등 등 다양한 변수들을 가집니다.
- 첫번째 칼럼 X_Minimum ~ 27번째 칼럼 SigmoidOfAreas
데이터출처: https://www.kaggle.com/mahsateimourikia/faults-nna/notebooks
제조 공정 데이터의 전반적 특성
- 제조 공정 데이터는 주로 불량률을 예측하여 불량을 일으키는 원인을 제거하거나 재고를 예측하여 수요에 맞는 생산을 진행하는 등의 목적성을 가집니다.
- 다른 데이터에 비하여 데이터를 얻는 과정이 자동화되어 있는 경우가 많아 데이터 퀄리티가 높은 편이며 결측치가 적은 경향성을 가집니다.
아래와 같이 데이터를 준비합니다.
In [91]:
#Cpu의 개수를 확인합니다.
n_cpu=os.cpu_count()
print("The number of cpus: ",n_cpu)
n_thread=n_cpu*2
print("Expected number of threads:",n_thread)
In [5]:
import os
import glob
In [6]:
os.listdir()
Out[6]:
In [7]:
import pandas as pd
import numpy as np
In [8]:
# 데이터를 읽어옵니다.
df = pd.read_csv("data/Faults.NNA", delimiter='\t', header=None)
df.head()
Out[8]:
In [9]:
# 칼럼 레이블을 읽어와서 데이터 프레임의 칼럼명으로 지정합니다.
attributes_name=pd.read_csv("data/Faults27x7_var", delimiter=' ', header=None)
df.columns=attributes_name[0]
In [10]:
df.columns
Out[10]:
In [11]:
df.head()
Out[11]:
In [13]:
df.describe()
Out[13]:
In [ ]:
종속변수가 7개니까 약간 원핫인코딩처럼 하나씩 1을 돌려가며 만들어준다는 뜻... 복잡¶
In [22]:
## 방법 1. 논리적 연산자 &를 활용하여 생성합니다.
conditions=[(df['Pastry'] == 1) & (df['Z_Scratch'] == 0)& (df['K_Scatch'] == 0)& (df['Stains'] == 0)& (df['Dirtiness'] == 0)& (df['Bumps'] == 0)& (df['Other_Faults'] == 0),
(df['Pastry'] == 0) & (df['Z_Scratch'] == 1)& (df['K_Scatch'] == 0)& (df['Stains'] == 0)& (df['Dirtiness'] == 0)& (df['Bumps'] == 0)& (df['Other_Faults'] == 0),
(df['Pastry'] == 0) & (df['Z_Scratch'] == 0)& (df['K_Scatch'] == 1)& (df['Stains'] == 0)& (df['Dirtiness'] == 0)& (df['Bumps'] == 0)& (df['Other_Faults'] == 0),
(df['Pastry'] == 0) & (df['Z_Scratch'] == 0)& (df['K_Scatch'] == 0)& (df['Stains'] == 1)& (df['Dirtiness'] == 0)& (df['Bumps'] == 0)& (df['Other_Faults'] == 0),
(df['Pastry'] == 0) & (df['Z_Scratch'] == 0)& (df['K_Scatch'] == 0)& (df['Stains'] == 0)& (df['Dirtiness'] == 1)& (df['Bumps'] == 0)& (df['Other_Faults'] == 0),
(df['Pastry'] == 0) & (df['Z_Scratch'] == 0)& (df['K_Scatch'] == 0)& (df['Stains'] == 0)& (df['Dirtiness'] == 0)& (df['Bumps'] == 1)& (df['Other_Faults'] == 0),
(df['Pastry'] == 0) & (df['Z_Scratch'] == 0)& (df['K_Scatch'] == 0)& (df['Stains'] == 0)& (df['Dirtiness'] == 0)& (df['Bumps'] == 0)& (df['Other_Faults'] == 1)]
1은 True 0 은 False로 자동으로 바꿔주는 astype 함수를 사용¶
In [19]:
conditions
Out[19]:
In [29]:
## 방법 2. pandas.Series.astype을 활용합니다.
conditions=[df['Pastry'].astype(bool),
df['Z_Scratch'].astype(bool),
df['K_Scatch'].astype(bool),
df['Stains'].astype(bool),
df['Dirtiness'].astype(bool),
df['Bumps'].astype(bool),
df['Other_Faults'].astype(bool)]
In [30]:
conditions
Out[30]:
이 astype을 일괄적으로 적용하고 싶어 그런함수를 짠 것¶
In [31]:
## (문제) 방법 3. pandas.Series.astype과 map, lambda를 활용합니다
# conditions_bf에 각 변수들의 Seris로 list를 구성합니다.
# conditions_bf을 사용하고 map, lambda를 활용하여 conditions_bf의 각 원소에 astype 함수를 적용합니다.
conditions_bf=[
df['Pastry'],
df['Z_Scratch'],
df['K_Scatch'],
df['Stains'],
df['Dirtiness'],
df['Bumps'],
df['Other_Faults']
]
conditions= list(map(lambda i: i.astype(bool), conditions_bf))
In [32]:
conditions_bf
Out[32]:
In [33]:
print(type(conditions))
print(type(conditions[0]))
print(len(conditions))
print(len(conditions[0]))
In [34]:
choices = ['Pastry', 'Z_Scratch', 'K_Scatch', 'Stains', 'Dirtiness', 'Bumps', 'Other_Faults']
In [35]:
choices
Out[35]:
In [36]:
df['class']=np.select(conditions,choices)
In [37]:
df['class']
Out[37]:
결국 class가 타겟 값이자 multiple classification이 목적¶
In [40]:
df.tail(50)
Out[40]:
EDA 결측치¶
In [42]:
df.isnull().sum()
Out[42]:
제조공정특징 - null이 없음¶
말이 안되는 값이 있는지 살펴보기¶
In [45]:
round(df.describe(),2)
Out[45]:
stain과 dirtiness가 너무적어 모델링시 퍼포먼스가 나오지 않을 확률이 높음¶
In [44]:
df['class'].value_counts()
Out[44]:
산점도를 통한 변수간의 상관관계 파악¶
In [47]:
import matplotlib.pyplot as plt
In [48]:
color_code = {'Pastry':'Red', 'Z_Scratch':'Blue', 'K_Scatch':'Green', 'Stains':'Black', 'Dirtiness':'Pink', 'Bumps':'Brown', 'Other_Faults':'Gold'}
In [49]:
color_code
Out[49]:
get 함수 -> key를 쓰면 value 를 반환¶
In [56]:
color_list=[color_code.get(i) for i in df.loc[:,'class']]
In [57]:
color_list
Out[57]:
In [59]:
# (문제) pandas.plotting.scatter_matrix, 위에서 만든 color_list를 활용해 scatter plot을 그리고 대각원소에는 히스토그램을 출력해봅니다. figsize= [30,30], alpha=0.3,s = 50 으로 지정합니다.
pd.plotting.scatter_matrix(df.loc[:,df.columns!='class'], c=color_list, figsize= [30,30], alpha=0.3,s = 50, diagonal='hist')
Out[59]:
scatter plot - 변수들 상관관계 및 선형관계인지아닌지 변수의 조합 (범주의 구분)¶
In [62]:
import seaborn as sns
sns.set_style('white')
In [64]:
g=sns.factorplot(x='class',data=df,kind='count',palette='YlGnBu',size=6)
g.ax.xaxis.set_label_text("Type of Defect")
g.ax.yaxis.set_label_text("Count")
g.ax.set_title("The number of Defects by Defect type")
Out[64]:
In [66]:
# 이전 cell에서 완성한 코드를 복사 붙여넣기 합니다.
g=sns.factorplot(x='class',data=df,kind='count',palette='YlGnBu',size=6)
g.ax.xaxis.set_label_text("Type of Defect")
g.ax.yaxis.set_label_text("Count")
g.ax.set_title("The number of Defects by Defect type")
# (문제) Barplot의 bar 상단에 값을 text로 달아줍니다.
for p in g.ax.patches:
g.ax.annotate((p.get_height()),(p.get_x()+0.2,p.get_height()+10))
상관계수를 활용한 변수간의 상관관계 파악¶
In [67]:
df_corTarget = df[['X_Minimum', 'X_Maximum', 'Y_Minimum', 'Y_Maximum', 'Pixels_Areas',
'X_Perimeter', 'Y_Perimeter', 'Sum_of_Luminosity',
'Minimum_of_Luminosity', 'Maximum_of_Luminosity', 'Length_of_Conveyer',
'TypeOfSteel_A300', 'TypeOfSteel_A400', 'Steel_Plate_Thickness',
'Edges_Index', 'Empty_Index', 'Square_Index', 'Outside_X_Index',
'Edges_X_Index', 'Edges_Y_Index', 'Outside_Global_Index', 'LogOfAreas',
'Log_X_Index', 'Log_Y_Index', 'Orientation_Index', 'Luminosity_Index',
'SigmoidOfAreas']]
In [68]:
corr=df_corTarget.corr()
corr
Out[68]:
vmax vmin 은 가장 진한 값이 1인지 -1인지 정하는것¶
In [69]:
# heatmap을 그리기 위한 파라미터들 설정
mask = np.zeros_like(corr, dtype=np.bool)
mask[np.triu_indices_from(mask)] = True
f, ax = plt.subplots(figsize=(11, 9))
cmap = sns.diverging_palette(1,200, as_cmap=True)
# (문제) 저장해둔 corr과 mask, cmap을 활용하여 correlation을 표현하는 heatmap을 그립니다. correlation에 맞게 최대, 최소, 중간값을 지정해줍니다.
# linewidths=2로 설정합니다. 그림 크기는 figsize=(11,9)로 설정합니다.
sns.heatmap(corr,mask=mask,cmap=cmap,vmax=1,vmin=-1,center=0,linewidths=2)
Out[69]:
Training, Test set 분리하기 y를 k_scatch로 지정해보기¶
In [71]:
x = df[['X_Minimum', 'X_Maximum', 'Y_Minimum', 'Y_Maximum', 'Pixels_Areas',
'X_Perimeter', 'Y_Perimeter', 'Sum_of_Luminosity',
'Minimum_of_Luminosity', 'Maximum_of_Luminosity', 'Length_of_Conveyer',
'TypeOfSteel_A300', 'Steel_Plate_Thickness',
'Edges_Index', 'Empty_Index', 'Square_Index', 'Outside_X_Index',
'Edges_X_Index', 'Edges_Y_Index', 'Outside_Global_Index', 'LogOfAreas',
'Log_X_Index', 'Log_Y_Index', 'Orientation_Index', 'Luminosity_Index',
'SigmoidOfAreas']]
y = df['K_Scatch']
In [72]:
from sklearn.model_selection import train_test_split
from scipy.stats import zscore
In [73]:
# (문제) sklearn.model_selection.train_test_split을 활용하여, x_train, x_test, y_train, y_test로 데이터를 나눕니다
# 그 비율은 8:2로 합니다. y값에 따라 stratify하여 나눕니다.
x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.2,random_state=1, stratify=y)
z 스코어는 정규화하는것 (표준화)¶
In [74]:
# (문제) pandas.DataFrame.apply를 활용하여 x_train과 x_test를 표준화합니다.
x_train = x_train.apply(zscore)
x_test = x_test.apply(zscore)
In [ ]:
In [77]:
round(x_train.describe(),2)
Out[77]:
9. [로지스틱 회귀분석] 로지스틱 기본 모형 만들기¶
In [85]:
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import confusion_matrix
from sklearn import metrics
In [86]:
#### liblinear 를 해야 릿지 라쏘를 구하는 것이 가능
In [87]:
lm=LogisticRegression(solver='liblinear')
로지스틱에서 고려해야할 Penalty의 형태 (Ridge, Lasso), regularization parameter range를 설정하여 이를 parameters에 dictionary 형태로 저장합니다.¶
In [88]:
parameters={'penalty':['l1','l2'],'C':[0.01,0.1,0.5,0.9,1,5,10],'tol':[1e-4,1e-2,1,1e2]}
그리드서치 - > 최적의 파라미터 구하기위해¶
In [92]:
GSLR=GridSearchCV(lm,parameters,cv=10,n_jobs=n_thread,scoring="accuracy")
In [93]:
GSLR.fit(x_train,y_train)
Out[93]:
원래는 validation 을 따로 떼서 튜닝을 해야하는데 validation set을 따로 떼면 Training set 손실이 일어나므로 그렇게 하지 않고 과적합도 방지하기위해 CV를 사용
In [95]:
# 최적의 파라미터 값 및 정확도 (Accuracy) 출력
print('final params', GSLR.best_params_)
print('best score', GSLR.best_score_)
In [97]:
predicted=GSLR.predict(x_test)
In [98]:
predicted
Out[98]:
In [99]:
cMatrix = confusion_matrix(y_test,predicted)
print(cMatrix)
print("\n Accuracy:", GSLR.score(x_test,y_test))
In [100]:
# sklearn.metrics.classification_report를 활용하여 report를 출력합니다.
print(metrics.classification_report(y_test,predicted))
In [101]:
# Cross validation 과정에서 계산된 정확도 값들을 출력해줍니다.
means = GSLR.cv_results_['mean_test_score']
stds = GSLR.cv_results_['std_test_score']
for mean, std, params in zip(means, stds, GSLR.cv_results_['params']):
print("%0.3f (+/-%0.03f) for %r"
% (mean, std * 2, params))
print()
[의사결정나무] 의사결정나무 기본 모형 만들기¶
In [102]:
from sklearn.tree import DecisionTreeClassifier
In [103]:
# (문제) 의사결정나무 모형을 만들어 dt에 저장합니다.
dt=DecisionTreeClassifier()
In [104]:
# (문제) 의사결정나무에서 고려해야할 criterion, min_samples_split, max_depth, min_samples_leaf, max_features 등을 고려하여 Grid search를 수행합니다.
# GridSearchCV의 옵션은 cv=10, n_jobs=n_thread, scoreing="accuracy"로 설정합니다.
parameters={'criterion':['gini','entropy'],'min_samples_split':[2,5,10,15], 'max_depth':[None,2],'min_samples_leaf':[1,3,10,15],'max_features':[None,'sqrt','log2']}
In [105]:
GSDT=GridSearchCV(dt,parameters,cv=10,n_jobs=n_thread,scoring="accuracy")
GSDT.fit(x_train,y_train)
Out[105]:
In [106]:
print('final params',GSDT.best_params_)
print('ACC.',GSDT.best_score_)
In [107]:
# (문제) predict 함수를 활용하여 예측 값을 구해 이를 predicted 에 저장하고 이를 출력하며 classification_report 또한 출력합니다.
predicted=GSDT.predict(x_test)
cMatrix = confusion_matrix(y_test,predicted)
print(cMatrix)
print(round(GSDT.score(x_test,y_test),3))
print(metrics.classification_report(y_test,predicted))
In [108]:
# Train에서의 종속변수의 분포
print(y_train.value_counts())
In [111]:
# 트리 시각화
import graphviz
dt2=DecisionTreeClassifier(criterion='entropy',max_depth=None,max_features=None,min_samples_leaf=1,min_samples_split=5)
dt2.fit(x_train,y_train)
dot_data=tree.export_graphviz(dt2,feature_names=x_train.columns,filled=True,rounded=True)
graph=graphviz.Source(dot_data)
graph
Random Forest¶
- Random Forest는 아래의 Bagging과 Drop-out을 활용하여 의사결정나무의 변동성을 완화시키고 예측력을 높인 모델이다.
- Bootstrapping: 복원추출을 통하여 샘플 구성이 조금씩 다른 여러 데이터셋을 생성해냄.
- Aggregating: 여러 모형의 결과를 통합하여 모형의 변동성을 낮춤.
- Drop-out: Tree를 구성할 때 변수를 일부 탈락시킴. Tree간의 correlation을 감소시켜 이 또한 모형의 변동성을 낮춤.
In [113]:
from sklearn.ensemble import RandomForestClassifier
In [114]:
rf=RandomForestClassifier()
In [116]:
# Random Forest에서 고려해야할 n_estimators, min_samples_split, max_depth, min_samples_leaf, max_features 등을 고려하여 Grid search를 수행합니다.
# GridSearchCV의 옵션은 cv=10, n_jobs=n_thread, scoreing="accuracy"로 설정합니다.
parameters={'n_estimators':[50,100],'criterion':['entropy'],'min_samples_split':[2,5],'max_depth':[None,2],'min_samples_leaf':[1,3,10],'max_features':['sqrt']}
GSRF=GridSearchCV(rf,parameters,cv=10,n_jobs=n_thread,scoring="accuracy")
GSRF.fit(x_train,y_train)
Out[116]:
In [117]:
print('final params',GSRF.best_params_)
print('best score',GSRF.best_score_)
In [118]:
predicted=GSRF.predict(x_test)
cMatrix=confusion_matrix(y_test,predicted)
print(cMatrix)
print(metrics.classification_report(y_test,predicted))
Support Vector Machine¶
- 노란색 margin을 최대화하는 boundary를 찾는 것이 목표.
- Error를 허용하는 정도를 C로 표현한다.
- C가 크면 Error를 많이 허용하고, C가 작을 수록 Error를 적게 허용한다.
In [121]:
from sklearn import svm
In [122]:
svc=svm.SVC()
In [124]:
# (문제) Support Vector Machine에서 고려해야할 C, kernel, gamma 등을 고려하여 Grid search를 수행합니다.
# GridSearchCV의 옵션은 cv=10, n_jobs=n_thread, scoreing="accuracy"로 설정합니다.
parameters={'C':[0.01,0.1,0.5,0.9,1,5,10],'kernel':['linear','rbf','poly'],'gamma':[0.1,1,10]}
GS_SVM=GridSearchCV(svc,parameters,cv=10,n_jobs=n_thread,scoring="accuracy")
GS_SVM.fit(x_train,y_train)
Out[124]:
In [125]:
# (문제) Support Vector Machine에서 고려해야할 C, kernel, gamma 등을 고려하여 Grid search를 수행합니다.
# GridSearchCV의 옵션은 cv=10, n_jobs=n_thread, scoreing="accuracy"로 설정합니다.
parameters={'C':[0.01,0.1,0.5,0.9,1,5,10],'kernel':['linear','rbf','poly'],'gamma':[0.1,1,10]}
GS_SVM=GridSearchCV(svc,parameters,cv=10,n_jobs=n_thread,scoring="accuracy")
GS_SVM.fit(x_train,y_train)
Out[125]:
In [126]:
print('final params',GS_SVM.best_params_)
print('best score',GS_SVM.best_score_)
In [127]:
# (문제) predict 함수를 활용하여 예측 값을 구해 이를 predicted 에 저장하고 이를 출력하며 classification_report 또한 출력합니다.
predicted=GS_SVM.predict(x_test)
cMatrix=confusion_matrix(y_test,predicted)
print(cMatrix)
print(metrics.classification_report(y_test,predicted))
신경망 모형¶
- 신경망 모형은 위와 같이 입력 데이터를 종합하여 결과값을 내는 구조를 가진 Perceptron을 중첩시키고 혼합시킨 구조이다. 아래와 같이 두 부분으로 나누어볼 수 있다.
- 입력값들의 선형합 구조인 transfer function
- activation function f()
- 이 때 입력값은 다른 perceptron의 출력값이 될 수 있으며 이것이 중첩되면 아래와 같이 나타날 수 있으며 이를 신경망 모형이라 한다.
- Input Layer: 입력 데이터가 위치하는 layer.
- Hidden Layer: 입력 데이터 혹은 또 다른 hidden layer의 출력값을 입력값으로 하는 perceptron이 위치하는 layer.
- Output Layer:마지막 hidden layer의 출력값을 입력값고 출력함수의 결과를 얻은 노드로 구성된 layer.
In [129]:
from sklearn.neural_network import MLPClassifier
In [130]:
# (문제) 신경망 모형을 만들어 ann_model에 저장합니다.
nn_model=MLPClassifier(random_state=1)
In [131]:
x_train.shape
Out[131]:
In [132]:
# (문제) 신경망 모형에서 고려해야할 alpha, hidden_layer_sizes, activation등을 고려하여 Grid search를 수행합니다.
# GridSearchCV의 옵션은 cv=10, n_jobs=n_thread, scoreing="accuracy"로 설정합니다.
parameters={'alpha':[1e-3,1e-1,1e1],'hidden_layer_sizes':[(5),(30),(60)],'activation':['tanh','relu'],'solver':['adam','lbfgs']}
GS_NN=GridSearchCV(nn_model,parameters,cv=10,n_jobs=n_thread,scoring="accuracy")
GS_NN.fit(x_train,y_train)
Out[132]:
In [133]:
print('final params', GS_NN.best_params_)
print('best score', GS_NN.best_score_)
In [134]:
means = GS_NN.cv_results_['mean_test_score']
stds = GS_NN.cv_results_['std_test_score']
for mean, std, params in zip(means, stds, GS_NN.cv_results_['params']):
print("%0.3f (+/-%0.03f) for %r"
% (mean, std * 2, params))
print()
In [ ]:
반응형
'Project & Kaggle' 카테고리의 다른 글
불량 타이어 검출을 위한 CNN 모델 개발 및 PYQT(EXE 실행 프로그램) 배포 프로젝트 (2) | 2021.06.21 |
---|---|
유럽 축구 경기 및 선수 특징 추출을 통한 승부 예측 (0) | 2021.04.02 |
데이터로 알아보는 리그 오브 레전드의 승리 예측 및 인사이트 (0) | 2021.02.09 |
학생들의 수업 시간 행동 분석을 통한 성적 예측 (0) | 2021.02.02 |
심부전증 환자 데이터를 통한 사망 여부 Classification (0) | 2021.02.01 |