[scipy, scikit, 통계, 회귀분석, 날씨예측, 로지스틱회귀분석, iris, knn, svm]
* scipy : 통계 관련 패키기¶
모형에 입력 변수 선정¶
1- 카이제곱 검정 (Chi-square Test )
` 이산형 변수 - 이산형 변수
` 성별과 구매여부 사이에 유의한 관계가 있는가
2- 독립표본t검정 (t-Test) : 이분류 모형의 경우
` 이산형 변수(2그룹) - 연속형 변수
` 체중과 구매여부 사이에 유의한 관계가 있는가
( 구매자와 비구매자의 평균 체중이 다른가? )
3- 분산분석 (ANOVA ) : 다분류 모형의 경우
` 이산형 변수(3그룹이상 ) - 연속형 변수
` 체중과 고객등급 사이에 유의한 관계가 있는가?
( 고객등급에 따라 평균 체중에 크게 다른가? )
[참고] 가설 검정¶
- 반증법에 의거해 증명
- 참고사이트1
- 참고사이트2
- 귀무가설과 대립가설 ex) 우리 대표 메뉴의 소고기 함량이 20g임을 증명하고자 한다면,
"모든 접시에 소고기 함량이 20g이 아니다"는 귀무가설에 두고 이에 20g에 미달됨이 없을 입증하여 이 가설을 기각함으로써 내가 입증하고픈 "우리 대표 메뉴의 소고기 함량은 20g이다"를 증명한다
1. 카이제곱 검정¶
: 이산형과 이산형 변수가 서로 상관관계가 있는지 확인
- 귀무가설 : 두 데이터는 상관관계가 없다
- 대립가설 : 두 데이터는 상관관계가 있다 (내가 주장하고 싶은 가설)
- p-value < 0.05 : 귀무가설 기각, 대립가설 채택
- p-value > 0.05 : 귀무가설 채택, 대립가설 기각
- p-value가 0.05보다 작으면 통계적으로 의미가 있어서 내가 주장하고 싶은 가설인 대립가설을 채택한다
from scipy import stats
data1=[4,6,15,10, 9, 11] # 관측치
data2=[10,10,10,10,10,10] # 기대치
#두 데이타가 관계가 있나?
#----------------------------------------
result = stats.chisquare(data1, data2)
result
Power_divergenceResult(statistic=7.8999999999999995, pvalue=0.16183361839504742)
[결론] pvalue 0.16으로 0.05보다 크다 귀무가설 채택, 대립가설 기각
- 귀무가설 : 두 데이터는 상관관계가 있다.
- 대립가설 : 두 데이터는 상관관계가 있다. (내가 주장)
2. t-test¶
전체 학생 중에서 20명의 학생들을 선택하여 전체 학생들의 평균키가 170cm 인지 확인한다.
- 귀무가설 : 학생들의 평균키가 175cm이다.
- 대립가설 : 학생들의 평균키가 175cm가 아니다
import numpy as np
from scipy import stats
np.random.seed(1) # 랜덤 결과가 동일하게 나오도록
# np.random.normal(0,5) : 평균 0, 표준편차 5인 난수
# for 에 _ 대신 변수명 아무거나 입력해도 되지만 그 변수를 사용하지 않기에 _로 표시해도 된다
heights = [ 180 + np.random.normal(0,5) for _ in range(20)]
print(heights)
[188.1217268183162, 176.94121793174963, 177.35914123868272, 174.63515688921916, 184.32703814662338, 168.49230651559859, 188.7240588210824, 176.19396549552448, 181.5951954802855, 178.75314812261294, 187.31053968522488, 169.69929645251173, 178.38791397993245, 178.07972822665792, 185.6688472116772, 174.50054366342985, 179.13785896224783, 175.61070791039313, 180.21106873357797, 182.9140760685791]
#----------------------------------------
stat, pvalue = stats.ttest_1samp(heights, 175)
pvalue
0.00277711459981648
[결론[
pvalue 1.53 * (10)(-7) = 0.000000153 은 0.05보다 작다
p-value < 0.05 : 귀무가설 기각, 대립가설 채택
p-value > 0.05 : 귀무가설 채택, 대립가설 기각
신뢰수준 95%에서 통계적으로 유의하다고 할 수 있다.
그래서 학생들의 평균키는 175가 아니다라고 할 수 있다.
독립표본 t-검정¶
: 독립된 2개의 표본이 다르지 확인 : ttest_ind(group1, group2)
전체 학생 중에서 각각 20명의 학생들을 선택한 2개의 그룹에서 평균키가 같은지 다른지 확인한다
- 귀무가설 : 학생들의 평균키는 같다
- 대립가설 : 학생들의 평균키는 같지 않다
import numpy as np
from scipy import stats
np.random.seed(1) # 랜덤 결과가 동일하게 나오도록
group1 = [180 + np.random.normal(0,5) for _ in range(20)] # np.random.normal(0,5) : 평균 0, 표준편차 5인 난수
print(group1)
group2 = [175 + np.random.normal(0,10) for _ in range(20)]
print(group2)
# 평균확인 - 평균은 비슷하다 하더라고 통계적으로 차이가 난다고 할 수 없다
print('group1의 평균 :', np.mean(group1))
print('group2의 평균 :', np.mean(group2))
[188.1217268183162, 176.94121793174963, 177.35914123868272, 174.63515688921916, 184.32703814662338, 168.49230651559859, 188.7240588210824, 176.19396549552448, 181.5951954802855, 178.75314812261294, 187.31053968522488, 169.69929645251173, 178.38791397993245, 178.07972822665792, 185.6688472116772, 174.50054366342985, 179.13785896224783, 175.61070791039313, 180.21106873357797, 182.9140760685791]
[163.99380822787077, 186.44723709839613, 184.01590720592796, 180.0249433890187, 184.0085594926441, 168.16272140825666, 173.77109774481352, 165.6423056574093, 172.32111920373984, 180.30355466738186, 168.08339248274692, 171.03246473144023, 168.128272998804, 166.5479435850128, 168.28753869163182, 174.873354010811, 163.82689651364723, 177.34415697817093, 191.5980217710987, 182.42044160577336]
group1의 평균 : 179.33317681769637
group2의 평균 : 174.54168687322976
result = stats.ttest_ind(group1, group2)
result
Ttest_indResult(statistic=2.142941903861293, pvalue=0.03858357345158148)
[결론]
95% 신뢰수준하에 pvalue가 0.05보다 작기에 통계적으로 유의할 수 있다.
귀무가설 기각하여 두 그룹의 평균키는 다르다라고 할 수 있다.
회귀분석 (Regression)¶
- 독립변수(X)와 종속변수(Y)의 관계식에서 독립변수가 한 단위 증가할 때 종속변수가 얼마나 영향을 받는지 분석
[예] 연속형변수와 연속형 변수를 비교할 때
- 나이(X)가 많을 수록 소득(Y)가 높은지 분석
- 광고지불비(X)에 따라 판매량이 영향을 받는지 분석
- 가계 수입과 사교육비 지출 사이에 관계가 있는지 분석
[참고그림] '모두의 딥러닝' 교재에서
** 회귀분석 종류
1) 단순회귀 분석 : 독립변수가 1개
` 광고지불비(X)를 이용하여 상품 매출액(Y) 예측할 때
2) 다중회귀 분석 : 독립변수가 2개 이상
` 어린이 연령(X1)과 하루 평균 학습시간(X2)를 이용하여 그 어린이의 성적(Y)을 예측하고자 할 때
%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
from scipy import stats
# 한글 폰트 설정
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name)
단순회귀분석 ( 선형회귀분석 )¶
- 독립변수가 1개인 경우
- 전기생산량(독립변수)과 전기소비량(종속변수)의 영향
- 귀무가설 : 전기생산량과 전기소비량 간에 상관관계가 없다
- 대립가설 : 전기생산량과 전기소비량 간에 상관관계가 있다
# 월별 전기생산금액
x= [3.52, 2.51, 3.91, 4.07, 3.98, 4.29, 4.81, 3.73, 4.61, 3.39, 3.20]
# 월별 전기 사용량
y= [2.48, 2.27, 2.47, 2.37, 3.09, 3.18, 3.88, 3.03, 3.55, 2.99, 2.88]
LinregressResult(slope=0.5546831443969521, intercept=0.8074740247672794, rvalue=0.7200942961345399, pvalue=0.012451312531534768, stderr=0.17816251936092412, intercept_stderr=0.6896465034280101)
##### 단순회귀분석
result = stats.linregress(x,y)
result
LinregressResult(slope=0.5546831443969521, intercept=0.8074740247672794, rvalue=0.7200942961345399, pvalue=0.012451312531534768, stderr=0.17816251936092412, intercept_stderr=0.6896465034280101)
- 기울기(slope)
- 절편(intercept)
- 상관계수(rvalue) :상관관계의 정도를 파악하는 값 ( -1에서 1 )
- 1에 근접하면 양의 상관관계 - -1에 근접하면 음의 상관관계 - 0에 근접하면 상관관계가 없다
- pvalue : 예측 불확실성의 정도를 나타내는 값
- 에러의 표준편차(stderr)
- 상관분석 : 두 변수 간에 선형적 관계가 있는지 분석
- 상관계수 : 상관관계의 정도를 파악하는 값 ( -1에서 1 )
- 1에 근접하면 양의 상관관계 - -1에 근접하면 음의 상관관계 - 0에 근접하면 상관관계가 없다
1) pvalue가 0.05보다 작으므로 통계적으로 유의미하기에 귀무가설을 기각하고 대립가설을 채택하여 전기생랸량과 소비생산량 간에 상관관계가 있다
2) rvalue(상관계수)가 1에 가까우므로 양의 상관관계가 있다고 볼 수 있다
##### 선형 회귀 분석값 얻어오기
slope, intercept, rvalue, pvalue, stderr = result = stats.linregress(x,y)
print('설명력 : ', rvalue)
if pvalue < 0.05:
print('통계적으로 유의미한 데이터')
else :
print('통계적으로 유의미하지 않은 데이터')
##### 산점도 그리기
plt.scatter(x,y);
plt.xlabel('전기생산량')
plt.ylabel('전기사용량')
##### 회귀선 그리기
x1 = np.array(x)
y1 = x1 * slope + intercept
plt.plot(x1,y1, c='red');
설명력 : 0.7200942961345399
통계적으로 유의미한 데이터
# 만일 전기생산량이 5라면 전기사용량은 얼마일까요?
5 * slope + intercept
3.5808897467520397
df = pd.read_csv('../data/ozone/ozone.csv')
df.head()
df.tail()
Ozone | Solar.R | Wind | Temp | Month | Day | |
---|---|---|---|---|---|---|
148 | 30.0 | 193.0 | 6.9 | 70 | 9 | 26 |
149 | NaN | 145.0 | 13.2 | 77 | 9 | 27 |
150 | 14.0 | 191.0 | 14.3 | 75 | 9 | 28 |
151 | 18.0 | 131.0 | 8.0 | 76 | 9 | 29 |
152 | 20.0 | 223.0 | 11.5 | 68 | 9 | 30 |
[ 작업단계 ]
- 결측치 행 제거
- 온도(Temp) 데이타 X와 오존(Ozone) 데이타 Y를 추출
- 회귀분석 결과 출력
[ 회귀 분석의 결과에 대한 분석 ]
df = df.dropna()
x= df['Temp']
y= df['Ozone']
##### 선형 회귀 분석값 얻어오기
slope, intercept, rvalue, pvalue, stderr = result = stats.linregress(x,y)
print('설명력 : ', rvalue)
if pvalue < 0.05:
print('통계적으로 유의미한 데이터')
else :
print('통계적으로 유의미하지 않은 데이터')
##### 산점도 그리기
plt.scatter(x,y);
plt.xlabel('온도')
plt.ylabel('오존')
##### 회귀선 그리기
x1 = np.array(x)
y1 = x1 * slope + intercept
plt.plot(x1,y1, c='red');
설명력 : 0.6985414096486389
통계적으로 유의미한 데이터
[ 작업단계 ]
- 산점도와 회귀선 그리기
회귀분석 (Regression)¶
- 독립변수(X)와 종속변수(Y)의 관계식에서 독립변수가 한 단위 증가할 때 종속변수가 얼마나 영향을 받는지 분석
[예] 연속형변수와 연속형 변수를 비교할 때
- 나이(X)가 많을 수록 소득(Y)가 높은지 분석
- 광고지불비(X)에 따라 판매량이 영향을 받는지 분석
- 가계 수입과 사교육비 지출 사이에 관계가 있는지 분석
[참고그림] '모두의 딥러닝' 교재에서
** 회귀분석 종류
1) 단순회귀 분석 : 독립변수가 1개
` 광고지불비(X)를 이용하여 상품 매출액(Y) 예측할 때
2) 다중회귀 분석 : 독립변수가 2개 이상
` 어린이 연령(X1)과 하루 평균 학습시간(X2)를 이용하여 그 어린이의 성적(Y)을 예측하고자 할 때
# 보스턴 주택가격 데이터셋
from sklearn.datasets import load_boston
# 회귀분석을 위한 패키기
from sklearn.linear_model import LinearRegression
# 학습용, 검증용 데이터를 나누기 위한 패키기
from sklearn.model_selection import train_test_split
#(1) 데이타 읽어오기
boston = load_boston()
boston.data.shape
print(boston.DESCR)
.. _boston_dataset:
Boston house prices dataset
---------------------------
**Data Set Characteristics:**
:Number of Instances: 506
:Number of Attributes: 13 numeric/categorical predictive. Median Value (attribute 14) is usually the target.
:Attribute Information (in order):
- CRIM per capita crime rate by town
- ZN proportion of residential land zoned for lots over 25,000 sq.ft.
- INDUS proportion of non-retail business acres per town
- CHAS Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)
- NOX nitric oxides concentration (parts per 10 million)
- RM average number of rooms per dwelling
- AGE proportion of owner-occupied units built prior to 1940
- DIS weighted distances to five Boston employment centres
- RAD index of accessibility to radial highways
- TAX full-value property-tax rate per $10,000
- PTRATIO pupil-teacher ratio by town
- B 1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town
- LSTAT % lower status of the population
- MEDV Median value of owner-occupied homes in $1000's
:Missing Attribute Values: None
:Creator: Harrison, D. and Rubinfeld, D.L.
This is a copy of UCI ML housing dataset.
https://archive.ics.uci.edu/ml/machine-learning-databases/housing/
This dataset was taken from the StatLib library which is maintained at Carnegie Mellon University.
The Boston house-price data of Harrison, D. and Rubinfeld, D.L. 'Hedonic
prices and the demand for clean air', J. Environ. Economics & Management,
vol.5, 81-102, 1978. Used in Belsley, Kuh & Welsch, 'Regression diagnostics
...', Wiley, 1980. N.B. Various transformations are used in the table on
pages 244-261 of the latter.
The Boston house-price data has been used in many machine learning papers that address regression
problems.
.. topic:: References
- Belsley, Kuh & Welsch, 'Regression diagnostics: Identifying Influential Data and Sources of Collinearity', Wiley, 1980. 244-261.
- Quinlan,R. (1993). Combining Instance-Based and Model-Based Learning. In Proceedings on the Tenth International Conference of Machine Learning, 236-243, University of Massachusetts, Amherst. Morgan Kaufmann.
속성정보:
- CRIM 인구 1인당 범죄 수
- ZN 25000평방 피트 이상의 주거 구역 비중
- INDUS 소매업 외 상업이 차지하는 면접 비율
- CHAS 찰스강 위치 변수 (1: 강주변, 0:이외 )
- NOX 일산화질소 농도 (parts per 10 million)
- RM 집의 평균 방수
- AGE 1940년 이전에 지어진 비율
- DIS 5가지 보스턴 시 고용 시설까지의 거리
- RAD 순환고속도로의 접근 용이성
- TAX $10000 달러당 부동산 세율 총계
- PTRATIO 지역별 학생과 교사 비율
- B 지역별 흑인 비율
- LSTAT 급여가 낮은 직업에 종사하는 인구 비율(%)
- MEDV 가격단위($1000)
import pandas as pd
df = pd.DataFrame(boston.data)
#print(boston.DESCR)
df.columns = boston.feature_names
df
boston.target
array([24. , 21.6, 34.7, 33.4, 36.2, 28.7, 22.9, 27.1, 16.5, 18.9, 15. ,
18.9, 21.7, 20.4, 18.2, 19.9, 23.1, 17.5, 20.2, 18.2, 13.6, 19.6,
15.2, 14.5, 15.6, 13.9, 16.6, 14.8, 18.4, 21. , 12.7, 14.5, 13.2,
13.1, 13.5, 18.9, 20. , 21. , 24.7, 30.8, 34.9, 26.6, 25.3, 24.7,
21.2, 19.3, 20. , 16.6, 14.4, 19.4, 19.7, 20.5, 25. , 23.4, 18.9,
35.4, 24.7, 31.6, 23.3, 19.6, 18.7, 16. , 22.2, 25. , 33. , 23.5,
19.4, 22. , 17.4, 20.9, 24.2, 21.7, 22.8, 23.4, 24.1, 21.4, 20. ,
20.8, 21.2, 20.3, 28. , 23.9, 24.8, 22.9, 23.9, 26.6, 22.5, 22.2,
23.6, 28.7, 22.6, 22. , 22.9, 25. , 20.6, 28.4, 21.4, 38.7, 43.8,
33.2, 27.5, 26.5, 18.6, 19.3, 20.1, 19.5, 19.5, 20.4, 19.8, 19.4,
21.7, 22.8, 18.8, 18.7, 18.5, 18.3, 21.2, 19.2, 20.4, 19.3, 22. ,
20.3, 20.5, 17.3, 18.8, 21.4, 15.7, 16.2, 18. , 14.3, 19.2, 19.6,
23. , 18.4, 15.6, 18.1, 17.4, 17.1, 13.3, 17.8, 14. , 14.4, 13.4,
15.6, 11.8, 13.8, 15.6, 14.6, 17.8, 15.4, 21.5, 19.6, 15.3, 19.4,
17. , 15.6, 13.1, 41.3, 24.3, 23.3, 27. , 50. , 50. , 50. , 22.7,
25. , 50. , 23.8, 23.8, 22.3, 17.4, 19.1, 23.1, 23.6, 22.6, 29.4,
23.2, 24.6, 29.9, 37.2, 39.8, 36.2, 37.9, 32.5, 26.4, 29.6, 50. ,
32. , 29.8, 34.9, 37. , 30.5, 36.4, 31.1, 29.1, 50. , 33.3, 30.3,
34.6, 34.9, 32.9, 24.1, 42.3, 48.5, 50. , 22.6, 24.4, 22.5, 24.4,
20. , 21.7, 19.3, 22.4, 28.1, 23.7, 25. , 23.3, 28.7, 21.5, 23. ,
26.7, 21.7, 27.5, 30.1, 44.8, 50. , 37.6, 31.6, 46.7, 31.5, 24.3,
31.7, 41.7, 48.3, 29. , 24. , 25.1, 31.5, 23.7, 23.3, 22. , 20.1,
22.2, 23.7, 17.6, 18.5, 24.3, 20.5, 24.5, 26.2, 24.4, 24.8, 29.6,
42.8, 21.9, 20.9, 44. , 50. , 36. , 30.1, 33.8, 43.1, 48.8, 31. ,
36.5, 22.8, 30.7, 50. , 43.5, 20.7, 21.1, 25.2, 24.4, 35.2, 32.4,
32. , 33.2, 33.1, 29.1, 35.1, 45.4, 35.4, 46. , 50. , 32.2, 22. ,
20.1, 23.2, 22.3, 24.8, 28.5, 37.3, 27.9, 23.9, 21.7, 28.6, 27.1,
20.3, 22.5, 29. , 24.8, 22. , 26.4, 33.1, 36.1, 28.4, 33.4, 28.2,
22.8, 20.3, 16.1, 22.1, 19.4, 21.6, 23.8, 16.2, 17.8, 19.8, 23.1,
21. , 23.8, 23.1, 20.4, 18.5, 25. , 24.6, 23. , 22.2, 19.3, 22.6,
19.8, 17.1, 19.4, 22.2, 20.7, 21.1, 19.5, 18.5, 20.6, 19. , 18.7,
32.7, 16.5, 23.9, 31.2, 17.5, 17.2, 23.1, 24.5, 26.6, 22.9, 24.1,
18.6, 30.1, 18.2, 20.6, 17.8, 21.7, 22.7, 22.6, 25. , 19.9, 20.8,
16.8, 21.9, 27.5, 21.9, 23.1, 50. , 50. , 50. , 50. , 50. , 13.8,
13.8, 15. , 13.9, 13.3, 13.1, 10.2, 10.4, 10.9, 11.3, 12.3, 8.8,
7.2, 10.5, 7.4, 10.2, 11.5, 15.1, 23.2, 9.7, 13.8, 12.7, 13.1,
12.5, 8.5, 5. , 6.3, 5.6, 7.2, 12.1, 8.3, 8.5, 5. , 11.9,
27.9, 17.2, 27.5, 15. , 17.2, 17.9, 16.3, 7. , 7.2, 7.5, 10.4,
8.8, 8.4, 16.7, 14.2, 20.8, 13.4, 11.7, 8.3, 10.2, 10.9, 11. ,
9.5, 14.5, 14.1, 16.1, 14.3, 11.7, 13.4, 9.6, 8.7, 8.4, 12.8,
10.5, 17.1, 18.4, 15.4, 10.8, 11.8, 14.9, 12.6, 14.1, 13. , 13.4,
15.2, 16.1, 17.8, 14.9, 14.1, 12.7, 13.5, 14.9, 20. , 16.4, 17.7,
19.5, 20.2, 21.4, 19.9, 19. , 19.1, 19.1, 20.1, 19.9, 19.6, 23.2,
29.8, 13.8, 13.3, 16.7, 12. , 14.6, 21.4, 23. , 23.7, 25. , 21.8,
20.6, 21.2, 19.1, 20.6, 15.2, 7. , 8.1, 13.6, 20.1, 21.8, 24.5,
23.1, 19.7, 18.3, 21.2, 17.5, 16.8, 22.4, 20.6, 23.9, 22. , 11.9])
#(2) 데이터와 레이블(답) 분리 변수 선언
#입력 데이터 X, 레이블(답: 주택가격) :y
X = df
y = boston.target
#(3) 훈련데이터와 테스트 데이터로 분리하기
#훈련 데이터 : 70 % 테스트 데이터 : 30 %
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.3 ,random_state=0)
print(X_train.shape)
print(X_test.shape) # 이게 어느정도 맞는지 테스트
(354, 13)
(152, 13)
#(4) 모델로 학습하기
model = LinearRegression()
lr = model.fit(X_train, y_train)
#(5) 모델검증
print('훈련 세트 검증 : {:2f}'.format( lr.score(X_train, y_train)))
print('테스트 세트 검증 : {:2f}'.format( lr.score(X_test, y_test)))
훈련 세트 검증 : 0.764545
테스트 세트 검증 : 0.673383
# 나의 예측
import numpy as np
sample_x = np.array([[0.00632,
18.0,
2.31,
0.0,
0.538,
6.575,
65.2,
4.0900,
1.0,
296.0,
15.3,
396.90,
4.98]])
sample_y = lr.predict(sample_x)
print('예측값: ', sample_y)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-34-81807bf37095> in <module>
16 4.98]])
17
---> 18 sample_y = lr.predict(sample_x)
19
20 print('예측값: ', sample_y)
NameError: name 'lr' is not defined
print('실제값:', y[0])
실제값: 24.0
1. 기상청 데이타 준비¶
- https://data.kma.go.kr > 데이터 > 기상관측 > 지상 > 종관기상관측(ASOS)
- 자료형태 : 일 자료
- 날짜 : 10년 데이타 : 2010 01 01 ~ 2019 12 31
- 지점 : 서울
- 기온 : 평균 기온
- weather 폴더 안에 'raw.csv' 파일로 저장
2. 데이타 정리¶
- raw.csv 파일을 읽어서 아래와 같이 가공하여 data.csv 파일로 저장
연,월,일,기온,품질,균질
2006,1,1,3.6,8,1
2006,1,2,4,8,1
2006,1,3,3.7,8,1
2006,1,4,4,8,1
2006,1,5,3.6,8,1
2006,1,6,2.1,8,1
....
[주의]
기존에 생성된 csv 파일이 EUC-KR인 경우가 많기에 문자셋 지정한다.
그러나 저장하는 data.csv 파일은 UTF-8로 문자셋을 지정하여 저장한다.
'''
in_file = "../data/weather/raw.csv"
out_file = "../data/weather/data.csv"
# CSV 파일을 한 줄 씩 읽어 들이기 ---(*1)
with open(in_file, "rt", encoding="EUC_KR") as fr:
lines = fr.readlines()
print(type(lines))
print(lines[:5])
# 기존의 데이터를 분리해서 가공하기 ---(*2)
# - 기존 데이타에서 5줄을 버리고 앞에 ["연,월,일,기온,품질,균질\n"] 붙이고자
lines = ["연,월,일,기온,품질,균질\n"] + lines[5:]
print(lines[:2])
# - /를 , 으로 변경
# map( function, list ) : list 각각의 요소에 함수를 적용
lines = map(lambda v: v.replace('/', ','), lines)
print(type(lines)) # : 여기서 lines은 map 객체임
# "".join(lines) : map 객체를 str 형태로
# strip()은 문자열을 처음과 끝에있는 공백문자를 제거
result = "".join(lines).strip()
# print(result)
# 결과를 파일에 출력하기 ---(*3)
with open(out_file, "wt", encoding="utf-8") as fw:
fw.write(result)
print("saved.")
'''
3. 학습 데이타와 테스트 데이타 만들기¶
- 예를 들어 2010년부터 2019년 데이타까지 있다면
2006년~2015년 데이타는 학습데이타로
2016년 데이타는 테스트데이타로
- 과거 6일의 데이터를 기반으로 학습할 데이터 만들기
예를 들어 현재 7일이라면 앞에 1일부터 6일까지는 학습데이타(X)가 되고 7일 데이타는 라벨(Y)가 된다.
from sklearn.linear_model import LinearRegression
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 기온 데이터 읽어 들이기
df = pd.read_csv('../data/weather/data.csv', encoding="utf-8")
# 데이터를 학습 전용과 테스트 전용으로 분리하기
train_year = (df["연"] <= 2015) #2010~2015
test_year = (df["연"] >= 2016) #2016~2019
interval = 6
# 과거 6일의 데이터를 기반으로 학습할 데이터 만들기
def make_data(data):
x = [] # 학습 데이터
y = [] # 결과
temps = list(data["기온"])
# 어렵게 구현했네
for i in range(len(temps)):
if i < interval: continue
y.append(temps[i])
xa = []
for p in range(interval):
d = i + p - interval
xa.append(temps[d])
x.append(xa)
return (x, y)
train_x, train_y = make_data(df[train_year])
test_x, test_y = make_data(df[test_year])
4. 선형 회귀 분석하기 ( LinearRegression )을 이용하여 예측하기¶
학습 후 예측값 (pre_y) 지정
lr = LinearRegression() # 어떤 모델을 쓸까
lr.fit(train_x, train_y)
LinearRegression()
# [참고] 검증하기
print('훈련 세트점수 : {:.2f}'.format( lr.score(train_x, train_y)))
print('테스트 세트점수 : {:.2f}'.format( lr.score(test_x, test_y)))
훈련 세트점수 : 0.94
테스트 세트점수 : 0.92
5. 결과를 그래프로 그리기¶
결과(test_y)와 예측(pre_y)을 그래프로 표현하기
pre_y = lr.predict(test_x)
plt.figure(figsize=(16,6))
plt.plot(pre_y, c='r')
plt.plot(test_y, c='b')
[<matplotlib.lines.Line2D at 0x249738cf6a0>]
6. 결과 평가하기¶
예측 기온과 실제 기온의 차이를 구해서 확인
pre_y - test_y
예측과 실제 차이의 평균과 최대 오차값을 구해서 확인한다
아래 결과를 확인하면 예측과 실제 차이의 평균은 1.66도 정도이고 최대 오차값은 8.47 정도이다
#하나의 데이터를 예측
test_x[0]
import numpy as np
sample_x = np.array([[7.5, 7.3, 9.3, 9.2, 10.9, 8.9]])
sample_y = lr.predict(sample_x)
print('예측값 :', sample_y)
print('실제값 :', test_y[0])
예측값 : [8.59997993]
실제값 : 8.7
diff_y = abs(pre_y - test_y)
print('실제값과 가장 큰 차이값 :', max(diff_y))
print('실제값과 예측값 차이의 평균 :', diff_y.mean() )
실제값과 가장 큰 차이값 : 8.471949619908472
실제값과 예측값 차이의 평균 : 1.664068497195426
[참고도서] 파이썬을 이용한 머신러닝, 딥러닝 실전 앱 개발 (위키북스)
로지스틱 회귀분석¶
- Logistic Regression 기본 배경
- 참/거짓으로 분류
- 이분으로 분류 : 합격인가 불합격인가
- 로지스틱 회귀 분석은 연속적인 값을 가지더라고, 로지스틱 함수의 결과값은 0과 1 사이의 값을 갖기에 이분법적인 분류 문제 해결하는 모형으로 적합하다
- 이름은 회귀이지만 분류 모형이다
- LOGIT 적용분야
- 기업 부도 예측
- 주가-환율-금리 예측
[참고] 로지스틱 회귀
[참고] 시그모이드 함수
[참고] 로지스틱회귀에서 퍼셉트론으로
[그림] 모두의 딥러딩
이 퍼셉트론은 그 후 인경신경망, 오차역전파 등의 발전을 거쳐 딥러닝으로 이어지게 된다.
타이타닉 데이타¶
성별(Sex), 나이(Age), 객실등급(Pclass), 요금(Fare)가 생존에 어느 정도의 영향을 미치는가
import pandas as pd
import numpy as np
# 데이타 로딩
df = pd.read_csv('../data/titanic/temp/train.csv')
df.head()
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | S |
4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S |
데이타처리
1) 나이, 요금은 숫자형으로 그래도 사용
2) 성별과 male/ female로 바로 처리할 수 없다
3) 객실등급은 1, 2, 3 으로 이루어져 있지만, 3등석이 높은 값으로 처리하여 결과가 외곡될 수 있다.
cols_to_keep = ['Survived','Age','Fare']
dummy_Sex = pd.get_dummies(df['Sex'] ,prefix='Sex')
dummy_Sex
dummy_Pclass = pd.get_dummies(df['Pclass'], prefix='Pclass')
dummy_Pclass
Pclass_1 | Pclass_2 | Pclass_3 | |
---|---|---|---|
0 | 0 | 0 | 1 |
1 | 1 | 0 | 0 |
2 | 0 | 0 | 1 |
3 | 1 | 0 | 0 |
4 | 0 | 0 | 1 |
... | ... | ... | ... |
886 | 0 | 1 | 0 |
887 | 1 | 0 | 0 |
888 | 0 | 0 | 1 |
889 | 1 | 0 | 0 |
890 | 0 | 0 | 1 |
891 rows × 3 columns
data = df[cols_to_keep]
data
data = data.join(dummy_Pclass)
data
data = data.join(dummy_Sex)
data
Survived | Age | Fare | Pclass_1 | Pclass_2 | Pclass_3 | Sex_female | Sex_male | |
---|---|---|---|---|---|---|---|---|
0 | 0 | 22.0 | 7.2500 | 0 | 0 | 1 | 0 | 1 |
1 | 1 | 38.0 | 71.2833 | 1 | 0 | 0 | 1 | 0 |
2 | 1 | 26.0 | 7.9250 | 0 | 0 | 1 | 1 | 0 |
3 | 1 | 35.0 | 53.1000 | 1 | 0 | 0 | 1 | 0 |
4 | 0 | 35.0 | 8.0500 | 0 | 0 | 1 | 0 | 1 |
... | ... | ... | ... | ... | ... | ... | ... | ... |
886 | 0 | 27.0 | 13.0000 | 0 | 1 | 0 | 0 | 1 |
887 | 1 | 19.0 | 30.0000 | 1 | 0 | 0 | 1 | 0 |
888 | 0 | 30.0 | 23.4500 | 0 | 0 | 1 | 1 | 0 |
889 | 1 | 26.0 | 30.0000 | 1 | 0 | 0 | 0 | 1 |
890 | 0 | 32.0 | 7.7500 | 0 | 0 | 1 | 0 | 1 |
891 rows × 8 columns
train_data = data[data.columns[1:]]
train_label = data['Survived']
train_data
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
lr.fit(train_data, train_label)
LogisticRegression()
print('훈련 데이터 검증:', lr.score(train_data, train_label))
훈련 데이터 검증: 0.797979797979798
분석결과¶
- coef(회귀계수)를 기준으로 생존 확인
- coef 수가 클수록 비례하고 음의 값이면 반비례하는 것이다.
- 나이가 적을 수록 생존확률이 높다
- 요금이 높을 수록 생존확률이 높다
- 객실등급에 따라 1등급 > 2등급 > 3긍급 순으로 생존확률이 높다
- 여자가 남자보다 생존 확룔이 높다 ( Sex_male은 남성값이기에 음수는 여성이 생존확률이 높다는 것이다 )
- 객실등급과 성별이 생존에 많은 영향을 미쳤다
# 기존 전체 데이타로 예측하기
print('나이 \t 요금 \t 1등실 \t 2등실 \t 3등실 \t 여자 \t 남자')
print(lr.coef_)
나이 요금 1등실 2등실 3등실 여자 남자
[[-3.19959128e-02 1.08306307e-03 1.06182543e+00 4.94196549e-02
-1.11422470e+00 1.27114618e+00 -1.27412579e+00]]
Survived 와 prdeict를 비교한다.
- Survived=1이면 생존이고 predict 0.5 이상의 값이면 생존으로 예측한 것이다.
- Survived=0이면 사망이고 predict 0.5 미만의 값이면 사망으로 예측한 것이다.
- 결과 확인 중 잘못 예측한 것도 있다 ( 14번째 )
# 예측
data['predict']= lr.predict(train_data)
data
Survived | Age | Fare | Pclass_1 | Pclass_2 | Pclass_3 | Sex_female | Sex_male | predict | |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 22.0 | 7.2500 | 0 | 0 | 1 | 0 | 1 | 0 |
1 | 1 | 38.0 | 71.2833 | 1 | 0 | 0 | 1 | 0 | 1 |
2 | 1 | 26.0 | 7.9250 | 0 | 0 | 1 | 1 | 0 | 1 |
3 | 1 | 35.0 | 53.1000 | 1 | 0 | 0 | 1 | 0 | 1 |
4 | 0 | 35.0 | 8.0500 | 0 | 0 | 1 | 0 | 1 | 0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
886 | 0 | 27.0 | 13.0000 | 0 | 1 | 0 | 0 | 1 | 0 |
887 | 1 | 19.0 | 30.0000 | 1 | 0 | 0 | 1 | 0 | 1 |
888 | 0 | 30.0 | 23.4500 | 0 | 0 | 1 | 1 | 0 | 1 |
889 | 1 | 26.0 | 30.0000 | 1 | 0 | 0 | 0 | 1 | 0 |
890 | 0 | 32.0 | 7.7500 | 0 | 0 | 1 | 0 | 1 | 0 |
891 rows × 9 columns
붓꽃 데이타¶
iris(붓꽃) 데이타셋 : 빅데이타, 머신러닝, 통계 등에서 많이 사용하는 데이타
Sepal Length 꽃받침의 길이 정보이다.
Sepal Width 꽃받침의 너비 정보이다.
Petal Length 꽃잎의 길이 정보이다.
Petal Width 꽃잎의 너비 정보이다.
Species 꽃의 종류 정보이다. ( setosa / versicolor / virginica)
붓꽃 데이타를 학습 데이타로 어느 모델에 넣었을 때 분꽃종류를 정확히 맞추면
그 모델은 성능이 좋은 분류(classfication) 모델이다.
또한 여기는 label에 해당하는 Species가 있기에 지도학습에 해당된다.
[참고] https://scikit-learn.org/stable/auto_examples/datasets/plot_iris_dataset.html
[용어] 데이타셋에서
샘플 = 한 행 데이타
특성 = 한 열 데이타
import numpy as np
from sklearn import datasets
iris = datasets.load_iris()
# ------------ iris 데이타셋 살펴보기
# 위의 참고문헌을 보면 iris는 Bunch클래스 객체인데 이는 Dictionary와 비슷한 구조
# Dictionary는 기본적으로 key와 value로 구성된다
print(iris.keys())
print(iris['data'][:10]) # 붓꽃의 4가지 정보
print(iris['target']) # 붓꽃의 종류를 0,1,2로 표현
print(iris['target_names'][:10]) # 붓꽃의 종류
print(type(iris['data'])) # 'numpy.ndarray'
print(iris['data'].shape)
print(iris['target'].shape)
dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename'])
[[5.1 3.5 1.4 0.2]
[4.9 3. 1.4 0.2]
[4.7 3.2 1.3 0.2]
[4.6 3.1 1.5 0.2]
[5. 3.6 1.4 0.2]
[5.4 3.9 1.7 0.4]
[4.6 3.4 1.4 0.3]
[5. 3.4 1.5 0.2]
[4.4 2.9 1.4 0.2]
[4.9 3.1 1.5 0.1]]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2]
['setosa' 'versicolor' 'virginica']
<class 'numpy.ndarray'>
(150, 4)
(150,)
# [참고] 간단하게 seaborn에 데이타셋으로 가져와서 그래프로 보면 꽃의 데이타로 species 를 알 수 있다
import seaborn as sns
sns.set(style='ticks')
iris = sns.load_dataset('iris')
sns.pairplot(iris, hue='species')
<seaborn.axisgrid.PairGrid at 0x274a2f009e8>
[ 그래프 ] 산점도 그래프
- 데이터에서 한 특성(feature)을 x축에 놓고 다른 하나는 y축에 놓아 각 데이터 포인트를 하니의 점으로 나타내는 그래프이다
- 특성(feature)가 적다면 그래프를 보며 클래스(꽃의 품좀)이 잘 구분되는지 확인한다.
- 물론 산점도 그래프는 특성들 간의 관계를 나타내는 것이 아니기 때문에 중요한 성질을 표현하지 못 할 수도 있다
* 절차¶
(1) 데이타 읽어오기
(2) 데이터와 레이블 분리 변수 선언
(3) 훈련데이터와 테스트 데이터로 분리하기
(4) 모델로 학습하기
(5) 예측하기
(6) 검증하기
(7) 정확도 측정하기
# (1) 데이타 읽어오기
import numpy as np
from sklearn import datasets
iris = datasets.load_iris()
print(iris.DESCR)
.. _iris_dataset:
Iris plants dataset
--------------------
**Data Set Characteristics:**
:Number of Instances: 150 (50 in each of three classes)
:Number of Attributes: 4 numeric, predictive attributes and the class
:Attribute Information:
- sepal length in cm
- sepal width in cm
- petal length in cm
- petal width in cm
- class:
- Iris-Setosa
- Iris-Versicolour
- Iris-Virginica
:Summary Statistics:
============== ==== ==== ======= ===== ====================
Min Max Mean SD Class Correlation
============== ==== ==== ======= ===== ====================
sepal length: 4.3 7.9 5.84 0.83 0.7826
sepal width: 2.0 4.4 3.05 0.43 -0.4194
petal length: 1.0 6.9 3.76 1.76 0.9490 (high!)
petal width: 0.1 2.5 1.20 0.76 0.9565 (high!)
============== ==== ==== ======= ===== ====================
:Missing Attribute Values: None
:Class Distribution: 33.3% for each of 3 classes.
:Creator: R.A. Fisher
:Donor: Michael Marshall (MARSHALL%PLU@io.arc.nasa.gov)
:Date: July, 1988
The famous Iris database, first used by Sir R.A. Fisher. The dataset is taken
from Fisher's paper. Note that it's the same as in R, but not as in the UCI
Machine Learning Repository, which has two wrong data points.
This is perhaps the best known database to be found in the
pattern recognition literature. Fisher's paper is a classic in the field and
is referenced frequently to this day. (See Duda & Hart, for example.) The
data set contains 3 classes of 50 instances each, where each class refers to a
type of iris plant. One class is linearly separable from the other 2; the
latter are NOT linearly separable from each other.
.. topic:: References
- Fisher, R.A. "The use of multiple measurements in taxonomic problems"
Annual Eugenics, 7, Part II, 179-188 (1936); also in "Contributions to
Mathematical Statistics" (John Wiley, NY, 1950).
- Duda, R.O., & Hart, P.E. (1973) Pattern Classification and Scene Analysis.
(Q327.D83) John Wiley & Sons. ISBN 0-471-22361-1. See page 218.
- Dasarathy, B.V. (1980) "Nosing Around the Neighborhood: A New System
Structure and Classification Rule for Recognition in Partially Exposed
Environments". IEEE Transactions on Pattern Analysis and Machine
Intelligence, Vol. PAMI-2, No. 1, 67-71.
- Gates, G.W. (1972) "The Reduced Nearest Neighbor Rule". IEEE Transactions
on Information Theory, May 1972, 431-433.
- See also: 1988 MLC Proceedings, 54-64. Cheeseman et al"s AUTOCLASS II
conceptual clustering system finds 3 classes in the data.
- Many, many more ...
# (2) 데이터와 레이블 분리 변수 선언 ( 이미 데이터와 레이블이 정해짐 )
X = iris['data']
X[:10]
y = iris['target']
y[:10]
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
# (3) 훈련데이터와 테스트 데이터로 분리하기
from sklearn.model_selection import train_test_split
train_test_split(X, y, random_state=0) # test_size 기본값 : 75: 25
X_train, X_test, y_train, y_test = train_test_split(X,y, random_state=0)
print(X_train[:10])
print(X_test[:10])
print(y_train[:10])
print(y_test[:10])
[[5.9 3. 4.2 1.5]
[5.8 2.6 4. 1.2]
[6.8 3. 5.5 2.1]
[4.7 3.2 1.3 0.2]
[6.9 3.1 5.1 2.3]
[5. 3.5 1.6 0.6]
[5.4 3.7 1.5 0.2]
[5. 2. 3.5 1. ]
[6.5 3. 5.5 1.8]
[6.7 3.3 5.7 2.5]]
[[5.8 2.8 5.1 2.4]
[6. 2.2 4. 1. ]
[5.5 4.2 1.4 0.2]
[7.3 2.9 6.3 1.8]
[5. 3.4 1.5 0.2]
[6.3 3.3 6. 2.5]
[5. 3.5 1.3 0.3]
[6.7 3.1 4.7 1.5]
[6.8 2.8 4.8 1.4]
[6.1 2.8 4. 1.3]]
[1 1 2 0 2 0 0 1 2 2]
[2 1 0 2 0 2 0 1 1 1]
# (4) 모델에 데이터를 학습하기
# 훈련데이타와 훈련레이블를 인자로 넣어 학습한 결과 knn 객체를 리턴한다
# n_neighbors : 이웃갯수 지정
from sklearn.neighbors import KNeighborsClassifier
model = KNeighborsClassifier(n_neighbors=1)
model.fit(X_train, y_train)
KNeighborsClassifier(n_neighbors=1)
# (5) 새로운 샘플 데이타가 들어왔을 때 label 예측하기
# 너무 동떨어진 데이타 입력하면 결과 예측 성능이 낮기에 기존 샘플과 유사하게 만듬
newData = np.array([[5.1, 2.9, 1., 0.3]])
pred = model.predict(newData)
print(pred)
print(iris['target_names'][pred])
[0]
['setosa']
# (6) 검증하기
# 실제 레이블과 예측값의 정확도 확인
print('검증:', model.score(X_test, y_test))
검증: 0.9736842105263158
# (7) 정확도 측정
'''
a = np.array([1,2,3,4])
b = np.array([1,2,3,5])
print(a==b)
print(np.mean(a==b)) # True=1, False=0 의 평균
'''
y_predict = model.predict(X_test)
accuracy = np.mean(y_predict == y_test)
print('정확도', accuracy)
from sklearn import metrics
ac_score = metrics.accuracy_score(y_test, y_predict)
print('정확도:', ac_score)
정확도 0.9736842105263158
정확도: 0.9736842105263158
* sklearn 라이브러리에서 간단한 분류 모델¶
- SVM ( Support Vector Machine )¶
- svm(서포트벡터머신:분류, 회귀) 알고리즘 : 분류(SVC), 회귀(SVR)
- fit() : 학습기계에 데이터를 학습시키는 메소드 - predict() : 데이터를 넣고 예측하는 메소드 - metrics.accuracy_score() : 정확도 측정 (검증)
+ 사용알고리즘 SVC ( 분류 )¶
from sklearn import svm
model = svm.SVC()
* 매개변수
1) gamma
- 데이터포인트 사이의 거리는 가우시안 커널에 의해 계산되는데, 가우시안 커널의 폭을 제어하는 매개변수
- 하나의 훈련 샘들이 미치는 영향의 범위를 결정
- gamma값이 크면 모델이 더 복잡해진다
2) C
- 각 포인트의 중요도를 제한
+ 머신러닝 프로그램 절차¶
(1) 데이타 읽기
(2) 데이터와 레이블 분리 변수 선언 - 데이타와 타켓(레이블)
* 데이타 분리 (열)
(3) 학습데이타와 검증 데이타 분류 - train_test_split()
* 데이타 분리 (행)
(4) 알고리즘 적용하여 학습 - fit()
(5) 예측 - predict()
(6) 정확도 - accuracy_score()
(7) 검증하기 - score()
import pandas as pd
from sklearn import datasets
from sklearn import svm, metrics
from sklearn.model_selection import train_test_split
# 1. 데이타로딩
iris = datasets.load_iris()
# 2. 데이터와 레이블 분리 변수 선언
X= iris.data
y= iris.target
# 3. 데이터셋 분리 ( 학습데이타:검증데이타 = 7:3 )
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.3 ,random_state=0)
print(X_train[:10])
print(X_test[:10])
print(y_train[:10])
print(y_test[:10])
[[5. 2. 3.5 1. ]
[6.5 3. 5.5 1.8]
[6.7 3.3 5.7 2.5]
[6. 2.2 5. 1.5]
[6.7 2.5 5.8 1.8]
[5.6 2.5 3.9 1.1]
[7.7 3. 6.1 2.3]
[6.3 3.3 4.7 1.6]
[5.5 2.4 3.8 1.1]
[6.3 2.7 4.9 1.8]]
[[5.8 2.8 5.1 2.4]
[6. 2.2 4. 1. ]
[5.5 4.2 1.4 0.2]
[7.3 2.9 6.3 1.8]
[5. 3.4 1.5 0.2]
[6.3 3.3 6. 2.5]
[5. 3.5 1.3 0.3]
[6.7 3.1 4.7 1.5]
[6.8 2.8 4.8 1.4]
[6.1 2.8 4. 1.3]]
[1 2 2 2 2 1 2 1 1 2]
[2 1 0 2 0 2 0 1 1 1]
# 4. 알고리즘 데이터를 학습시키고 예측하기
# 분류모델을 이용하여 학습데이타를 넣고 훈련하고 예측한다
model = svm.SVC()
model.fit(X_train, y_train) # 학습하기
# 5. 예측하기
pre_label = model.predict(X_test) # 예측하기
print(pre_label)
# 6. 정확도
from sklearn import metrics
ac_score = metrics.accuracy_score(y_test, pre_label)
print('정확도:', ac_score)
# 7. 검증하기
print('검증:', model.score(X_test, y_test))
[2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0 2 1 0 2 2 1 0
2 1 1 2 0 2 0 0]
정확도: 0.9777777777777777
검증: 0.9777777777777777
from sklearn import svm, metrics
import random, re # re : 정규표현식
# 1. 붓꽃 데이터 읽어 들이기
csv = []
with open('../data/iris/iris.csv','r', encoding='utf-8') as fp:
# iris.csv 파일을 r(읽기모드)로 열다
for line in fp: # 한 줄씩 읽어오기
line = line.strip() # 줄바꿈 제거
cols = line.split(',')# 쉼표로 컬럼을 구분
# 문자열 데이터를 숫자(실수)로 변환하기
# 파이썬의 삼항연산자
# (값)=(True일 때의 값) if (조건) else (False일 때의 값)
fn = lambda n:float(n) if re.match(r'^[0-9\.]+$',n) else n
cols = list(map(fn, cols))
csv.append(cols)
# 추후에 pandas로 간편하게 데이타셋 읽어올 수 있음
# 헤더(컬럼명) 제거
del csv[0]
# 품종별로 데이타 순서로 있기에 학습데이타와 테스트데이타를 나누기 전에 섞는다
# 그래야 각각의 데이타에 품종별로 골로루 데이타가 들어가도록
random.shuffle(csv)
# 학습데이타와 테스트 데이터로 분리하기
total_len = len(csv)
train_len = int(total_len*2/3) # 학습데이타 2/3, 테스트데이터 1/3
train_data=[]
train_label=[]
test_data=[]
test_label=[]
for i in range(total_len):
data=csv[i][0:4]
label=csv[i][4]
if i < train_len:
train_data.append(data)
train_label.append(label)
else:
test_data.append(data)
test_label.append(label)
print(train_data[:10])
print(train_label[:10])
print(test_data[:10])
print(test_label[:10])
# 분류모델을 이용하여 학습데이타를 넣고 훈련하고 예측한다
clf = svm.SVC(gamma='auto')
clf.fit(train_data, train_label) # 학습하기
pre_label = clf.predict(test_data) # 예측하기
# 검증하기 - 정확도
ac_score = metrics.accuracy_score(test_label, pre_label)
print(ac_score)
'Programing Language > Python' 카테고리의 다른 글
0830 데이터 정제 (0) | 2021.08.30 |
---|---|
0827 matplotlib 시각화 (0) | 2021.08.29 |
0826 Pandas, 미국 대통령 데이터, 판다스 계산, 시각화 (0) | 2021.08.26 |
0825 Python , jupyterNoteBook (0) | 2021.08.25 |
python Day 3 (0) | 2021.08.05 |
댓글