에러:
ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.
해결:
model = LogisticRegression(random_state=42) 을
model = LogisticRegression(random_state=42, solver='lbfgs', max_iter=100) 로 수정한다.
에러:
ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.
해결:
model = LogisticRegression(random_state=42) 을
model = LogisticRegression(random_state=42, solver='lbfgs', max_iter=100) 로 수정한다.
(base) conda info --envs
(base) conda list
(base) conda remove --prefix [PATH] --all
(base) conda remove --name --all
(base) activate test
(test)
명령어 conda 나 pip 가 같은 역할의 명령을 수행함.
주의: 모듈을 설치할때는 conda 대신 pip 사용하길 추천함 (아래 글 참고). 버전 충돌이나 miniconda 충돌 등이 발생할 수 있음.
encoding은 OS 시스템 마다 다르다.
linux 는 utf8 사용
windows 는 cp949 사용
해결
import pandas as pd
df=pd.read_csv(infile, encoding='cp949')
참고
linux 에서는 encoding 을 설정할 필요가 없다.
pandast to_csv() 보면 default: utf-8 이 이미 설정되어 있음.
파이썬은 파일 경로 또는 디렉토리와 관련한 코드가 많이 필요
파일 및 디렉토리 경로에 관한 함수는 모두 os 모듈을 사용하기 때문에 os 모듈의 import가 필요
get current working directory
print(os.getcwd())# /Users/evan/dev/python/web-crawler-py/parsed_data
dir, file = os.path.split("/Users/evan/dev/python/web-crawler-py/parsed_data")print(dir, file, sep="\n")# /Users/evan/dev/python/web-crawler-py# parsed_data
print("/Users/evan/dev/python/web-crawler-py/parsed_data".split(os.path.sep))# ['', 'Users', 'evan', 'dev', 'python', 'web-crawler-py', 'parsed_data']
print(os.path.join("/Users/evan/dev/python/web-crawler-py/parsed_data", "test"))# /Users/evan/dev/python/web-crawler-py/parsed_data/test
print(os.listdir("/Users/evan/dev/python/web-crawler-py/parsed_data"))# ['migrations', 'models.py', '__init__.py', '__pycache__', 'apps.py', 'parser.py', 'admin.py', 'tests.py', 'views.py']
print(os.path.exists("/Users/evan/dev/python/web-crawler-py/parsed_data"))# Trueprint(os.path.exists("/Users/evan/dev/python/web-crawler-py/parsed_data/admin.py"))# True
print(os.path.isdir("/Users/evan/dev/python/web-crawler-py/parsed_data"))# Trueprint(os.path.isdir("/Users/evan/dev/python/web-crawler-py/parsed_data/admin.py"))# False
print(os.path.isfile("/Users/evan/dev/python/web-crawler-py/parsed_data"))# Falseprint(os.path.isfile("/Users/evan/dev/python/web-crawler-py/parsed_data/admin.py"))# True
print(os.path.getsize("/Users/evan/dev/python/web-crawler-py/parsed_data"))# 352
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
import osprint(__file__)# /Users/evan/dev/python/web-crawler-py/parsed_data/parser.pyprint(os.path.abspath(__file__))# Users/evan/dev/python/web-crawler-py/parsed_data/parser.pyprint(os.path.dirname(os.path.abspath(__file__)))# /Users/evan/dev/python/web-crawler-py/parsed_data
1. __file__은 해당 파일이 모듈로서 로드되면 __file__이라는 이름으로 설정됩니다.
2. __file__을 절대 경로화 해줍니다. (맨 앞 /가 붙는 것 빼고는 차이점이 없습니다.)
3. 절대 경로에서 디렉터리 경로를 가져옵니다.
4. BASE_DIR이라는 변수에 저장에 사용합니다.
출처: https://itmining.tistory.com/122 [IT 마이닝]
Roughly 10% of ·OH in the troposphere reacts with CH4
[CH4] ~ 1.6 – 1.7 ppm (global avg.)
higher temperature combustion
biomass burning
lightning
그림 설명
기본적으로 NO2가 반응식에 보이면, 광화학 반응에 의해 O3을 생성한다고 알고 있어야 함.
하지만, NOx-NO2 상호간의 변화는 null-cycle 로서 O3을 생성하지 않음
NO2가 태양광에 의해서 NO + O로 해리되고 O2와 만나 O3를 생성할 지라도, 다시 오존이 NO에 의해서 소멸되므로 알짜 방정식에서 O3은 생성되지 않음.
그 외 다른 물질들이 광화학 연쇄반응식 중간에 NO2를 생성한다면, 알짜식에서 반드시 O3 생성
VOC radical (RO2*)이 NO와 반응하면 O* + NO가 NO2를 생성함. 이후 태양광에 의해 자연스럽게 O3 생성
NOx 농도가 낮아 VOC/NO2가 높은 경우, RO2*은 O3 생성 반응보다 과산화물(peroxide) 생성 반응을 더 선호하여, ROOR'을 생성한다. ROOR'의 전형적인 예는 과산화수소(H2O2).
NOx 감소는 OH를 더 많이 생성하여 RO2*를 증가시켜 O3 생성 가속.
EPA EKMA 에서 사용한 전형적인 O3 isopleth
O3 오염은 비선형관계로 결정됨.
주로 도시 풍하측 또는 교외 지역
"NOx-limited": 그 지역의 O3농도는 NOx에 의해 주로 결정된다는 의미
주로 대기오염이 높은 도시 지역
"VOC-limited": 그 지역의 VOC농도는 O3에 의해 주로 결정된다는 의미
Heavy fog in morning hours
Low inversion height (~ 300 ft)
[SO2] ~ 1.3 ppm
[Particles] ~ 4.5 mg m-3
Sulfurous fog (SO4(2-) by coal burning
In the afternoon “Photochemical smog”
In the afternoon “Photochemical smog”
우리나라는 정유공장이 많은 지역에서 발생할 수 있는 유형
주로 중국발 미세먼지의 전형적인 유형
국내 대기화학 책보다 국외서가 더 많이 읽히기 때문에 용어정리가 필요하다.
특히 Seinfeld & Pandis 책을 볼때는 이해가 되는 듯 하지만, 막상 기업이나 국내 학회에서 사용하는 용어는 한글로 번역되어야 하는데, 여러 학회 내에서 여전히 용어 정리 중이다.
아래는 대기화학을 공부하는데 기초적인 대표물질들을 정리해 둔 것임(update 가능)
기본적으로 산화제는 동시에 환원제임
CO2 carbon dioxide (이산화탄소)
CO carbon monoxide (일산화탄소)
O3 ozone
NO nitrogen oxide (일산화질소)
NO2 nitrogen dioxide (이산화질소)
N2O nitrous oxide (아산화질소)
NO3- nitrate (질산염)
HNO3 nitric acid (질산)
N2O5 dinitrogen pentoxide (오산화질소)
S sulfur (황)
SO2 sulfur dioxide (이산화황)
SO3 sulfate trioxide (삼산화황)
SO4-2 sulfate (황산염)
NH3 ammonia (암모니아)
NH4+ ammonium (암모늄 이온)
OH hydroxly radical
HO2· (peroxy radicals)
CH3· (methyl radical)
CH3O2· (methyl peroxy radical)
CH3O· (methoxy radical)
HCHO (formaldehyde)
PAN (Peroxyacyl nitrates)
*OH( (Hydroxy radical; 하이드록실 라디칼)
HO2* (Hydroperoxy radical; 하이드로퍼옥실 라디칼)
CH3* (Methyl radical; 메틸 라디칼)
CH3O* (Methoxy radical; 메톡시 라디칼)
CH3O2* (Methyl peroxyl radical; 메틸퍼옥실 라디칼)
>>> from matplotlib import pyplot as plt
ModuleNotFoundError: No module named 'matplotlib'
이 문서는 위 에러를 고치는 과정을 통해서, Rstudio에서 python 사용시 Anacona와 Minconda 모듈 충돌 발생하는 경우의 전반적인 문제를 한 번에 해결할 수 있다.
R 4.1.0 이상에서도 파이썬으로 딥러닝 코드를 구현할 수 있다.
Rstudio 설치 후, 맨 처음 import os 같은 파이썬 코드를 불러오면, 아래와 같이 reticulate::repl_pyton() 이라는 모듈을 자동으로 설치한다. 자세히 보면, Miniconda3가 설치되는 것을 볼 수 있다.
이 Minconda 가 기존에 설치된 Anacona 와 충돌을 일으키는 경우가 있다.
예를 들면, 아래와 같이 matplotlib 문제이다.
>>> from matplotlib import pyplot as plt
ModuleNotFoundError: No module named 'matplotlib'
PC에 설치된 Anaconda와 Miniconda
모듈이 설치되어 있지 않은가 해서, Anaconda Prompt (anacond3) 상에서
> pip list 하면
아래와 같이 matplolib이 이미 설치되어 있음을 알 수 있다.
따라서, anaconda가 아니라 Miniconda를 살펴봐야 한다.
Rstudio는 reticulate 패키지를 설치하는데, r-reticulate 가상 환경에서 모둘을 설치해 주어야 한다.
아래와 같은 순서로 진행하면, Rstudio에서 에러를 피할 수 있다.
1. Anaconda Prompt (R~MINI~1) 열기
2. (base) > conda env list
3. (base) > activate r-reticulate
4. (base) > pip list
어디에도 matplotlib이 없다.
5. (r-reticulate) pip install matplolib
conda install 은 가급적 피하시길 (관련글: Tensorflow GPU 작동하지 않을때, 재설치 없이 수리하는 법)
6. 마지막으로 Rstudio 에서
>>> from matplotlib import pyplot as plt
하면 에러 사라짐.
1. 혹시 모를 버전 충돌 등을 고려하여 가상환경을 먼저 제거한다.
2. Anacona를 제거한다.
(이 방법은 Miniconda 에서도 동일하다)
아래 설명에서는 r-reticulate 가상 환경 모두 지우는 방법
(base) >conda env list
# conda environments:
#
base * C:\Users\chpark\miniconda3
chpark C:\Users\chpark\miniconda3\envs\chpark
r-reticulate C:\Users\chpark\miniconda3\envs\r-reticulate
(base) > conda remove --name r-reticulate --all
Remove all packages in environment C:\Users\chpark\miniconda3\envs\r-reticulate:
## Package Plan ##
environment location: C:\Users\chpark\miniconda3\envs\r-reticulate
Proceed ([y]/n)?
The following packages will be REMOVED:
certifi-2019.11.28-py36_0
pip-20.0.2-py36_1
python-3.6.10-h9f7ef89_0
setuptools-46.0.0-py36_0
sqlite-3.31.1-he774522_0
vc-14.1-h0510ff6_4
vs2015_runtime-14.16.27012-hf0eaf9b_1
wheel-0.34.2-py36_0
wincertstore-0.2-py36h7fe50ca_0
Proceed ([y]/n)?
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
(base) >conda env list
# conda environments:
#
base * C:\Users\chpark\miniconda3
chpark C:\Users\chpark\miniconda3\envs\chpark
(base) C:\Users\chpark>
r-reticulate 가상환경이 모두 사라진 것을 확인 할 수 있다.
같은 방법으로 (base)만 남기고 다 제거한다.
(base)는 prompt 상에서는 제거되지 않으므으로 아래 방법으로 시스템에서 제거한다.
아나콘다의 경우, C:\Users\miniconda3\Uninstall-Anaconda3.exe 실행
미니콘다의 경우, C:\Users\miniconda3\Uninstall-Miniconda3.exe 실행
분류와 회귀에서 사용하는 용어 정리
샘플(입력): 학습 모델에 들어갈 하나의 데이터
예측(출력): 모델 결과 값
타깃(정답): 모델이 완벽하게 예측해야 하는 값
참값(꼬리표, annotation): 일반적으로 사람에 의해 수집된 데이터셋에 대한 모든 타깃.
예측오차(손실값): 모델의 예측과 타깃 사이의 (거리) 차이값
클래스: 분류 문제에서 선택할 수 있는 레이블의 집합.
예) 고양이-강아지 분류 문제에서 클래스는 "고양이"와 "강아지" 2개
레이블: 분류
가장 흔한 학습 방법
주어진 샘플 데이터의 (사람이 만든)레이블 또는 꼬리표(annotation)에 입력 데이터를 매핑하는 방법을 학습시킴
대부분 분류와 회귀 문제로 구성됨
예) 구문 트리 예측, 물체 감지
타깃없이 입력 데이터의 변환을 찾는 학습방법
데이터 시각화, 데이터 압축, 데이터 노이즈 제거, 데이터 상관관계를 더 잘 이해하기 위해 사용
지도학습 문제를 풀기 전에 데이터셋을 잘 이해하기 위해 사용하는 필수 단계로 이용되기도 함
예) 차원축소, 군집
사람이 만든 레이블을 사용하지 않음으로 학습 과정에 사람이 개입하지 않는 지도 학습.
예) 오토인코더(autoencoder), 비디오 다음 프레임 예측, 다음 단어 예측
구글 딥마인드의 아타리 게임과 알파고 바둑대국 성공으로 주목 받기 시작함.
환경에 대한 정보를 받아 보상을 최대화하는 행동을 선택하도록 학습시킴
예를 들어, 게임 점수를 최대화하기 위한 게임 내의 행동을 출력
대부분 연구영역, 게임 외 성공 사례가 없음.
예) 자율 주행 자동차, 자원 관리, 교육
0에서 9까지 10가지로 분류될 수 있는 손글씨 숫자 이미지 70,000개
각 이미지는 28×28 픽셀로 구성
각 픽셀은 아래와 같이 0~255 사이의 숫자 행렬로 표현됩니다.
[[ 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 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 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 0 0 3 18 18 18 126 136 175 26 166 255 247 127 0 0 0 0]
[ 0 0 0 0 0 0 0 0 30 36 94 154 170 253 253 253 253 253 225 172 253 242 195 64 0 0 0 0]
[ 0 0 0 0 0 0 0 49 238 253 253 253 253 253 253 253 253 251 93 82 82 56 39 0 0 0 0 0]
[ 0 0 0 0 0 0 0 18 219 253 253 253 253 253 198 182 247 241 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 80 156 107 253 253 205 11 0 43 154 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 14 1 154 253 90 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 139 253 190 2 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 11 190 253 70 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 35 241 225 160 108 1 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 81 240 253 253 119 25 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 45 186 253 253 150 27 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 93 252 253 187 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 249 253 249 64 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 46 130 183 253 253 207 2 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 39 148 229 253 253 253 250 182 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 24 114 221 253 253 253 253 201 78 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 23 66 213 253 253 253 253 198 81 2 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 18 171 219 253 253 253 253 195 80 9 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 55 172 226 253 253 253 253 244 133 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 136 253 253 253 212 135 132 16 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 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]]
60,000개의 이미지는 훈련 (Training)에 사용
10,000개의 이미지는 테스트 (Test)에 사용
# Tf를 쓰면 무려 Mnist 데이터를 다운받지 않아도 됨.
>>> import tensorflow as tf
# Tf에서는 train / test set을 자동으로 나눔.
>>> mnist = tf.keras.datasets.mnist
>>> (x_train, y_train), (x_test, y_test) = mnist.load_data()
# 딥러닝은 0~1 사이로 input 데이터의 범위를 해줘야 원활한 학습이 가능.
# 0~1 사이로 맞춰주기 위해서 255로 나눔.
>>> x_train, x_test = x_train / 255.0, x_test / 255.0
>>> x_train.shape
# tf.keras.models.Sequential()을 이용해서 인공신경망 모델을 구성
>>> model = tf.keras.models.Sequential([
# 입력층 (Input layer)에서 Flatten()을 이용해서 28×28 픽셀의 값을 784개의 1차원 배열로 변환
... tf.keras.layers.Reshape((28, 28, 1)),
# 각 층은 512개와 10개의 인공 뉴런 노드를 갖고 활성화 함수 (activation function)로는 각각 ReLU (tf.nn.relu)와 소프트맥스 (tf.nn.softmax) 사용.
... tf.keras.layers.Conv2D(16, 3, activation='relu'),
... tf.keras.layers.Flatten(),
... tf.keras.layers.Dense(128),
... tf.keras.layers.Dense(10, activation='softmax')
... ])
>>> model.compile(optimizer='adam',
... loss='sparse_categorical_crossentropy',
... metrics=['accuracy'])
>>> model.fit(x_train, y_train, epochs=5)
# model.evaluate()를 이용해서 10,000개의 테스트 샘플에 대해 손실 (loss)과 정확도 (accuracy)를 평가
>>> test_loss, test_acc = model.evaluate(x_test, y_test)
>>> print('테스트 정확도:', test_acc)
# Matplotlib을 이용해서 에포크에 따른 정확도 (accuracy)와 손실 (loss) 값을 확인
>>>loss, accuracy = [], []
>>>for i in range(10):
... model.fit(x_train, y_train, epochs=1)
... loss.append(model.evaluate(x_test, y_test)[0])
... accuracy.append(model.evaluate(x_test, y_test)[1])
>>>print(accuracy)
import tensorflow as tf
# Tf를 쓰면 무려 Mnist 데이터를 다운받지 않아도 됩니다.
mnist = tf.keras.datasets.mnist
# 또한 train / test set을 알아서 나눠 줍니다.
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# mnist 데이터는 0~255 범위의 데이터 입니다.
# 이를 0~1 사이로 맞춰주기 위해서 255로 나누는 것인데
# 딥러닝은 0~1 사이로 input 데이터의 범위를 해줘야 학습이 잘 됩니다.
x_train, x_test = x_train / 255.0, x_test / 255.0
x_train.shape
model = tf.keras.models.Sequential([
tf.keras.layers.Reshape((28, 28, 1)),
tf.keras.layers.Conv2D(16, 3, activation='relu'),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128),
tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5)
## 모델 평가
# model.evaluate(x_test, y_test, verbose=2)
# 코드를 읽고, 코딩하기도 편하게 따로 불러와줍니다.
test_loss, test_acc = model.evaluate(x_test, y_test)
print('테스트 정확도:', test_acc)
#1회의 에포크마다 model.evaluate()의 loss, accuracy 값을 출력력
loss, accuracy = [], []
for i in range(10):
model.fit(x_train, y_train, epochs=1)
loss.append(model.evaluate(x_test, y_test)[0])
accuracy.append(model.evaluate(x_test, y_test)[1])
print(accuracy)
# end of code