묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결버그헌팅과 시나리오 모의해킹 전문가 되기
21강 '권한 상승 단계 - 시스템 커널 취약점을 이용한 상위 권한 획득' 강의 관련 공유 및 문의 사항
안녕하세요. 김태영 팀장님 basic_Pentesting_1에 관한 문의 및 공유 사항이 있습니다. 현재 2022년 2월 11일에 vulnhub를 통해서 다운로드한 basic_pentesting_1의 경우 현재 kernel 버전이 4.15.0 버전으로 확인됩니다. [basic_pentesting_1에 reverse shell을 연결하고 hostnamectl로 확인한 정보] 따라서 21강에서 진행한 것 처럼 eBPF 취약점을 이용한 시스템 권한 상승 공격을 시도하면 error가 발생하면서 권한 상승이 되지 않습니다. 커널 버전 이 높아지면서 취약점 패치가 된 것으로 생각됩니다. 추후에 이점에 대한 추가 강의나 강의 내용 수정이 있는지 궁금합니다. P.S 제 개인적인 사견으로는 문제 출제자가 kernel 취약점을 이용하기 보다는 다른 방식으로 권한 상승을 하기를 원해서 해당 버전으로 커널을 업데이트 한 것으로 추정됩니다. 따로 exploit-DB에서 해당 버전의 취약점을 찾아봤지만 저는 4.15버전 kernel 취약점을 찾을 수가 없었습니다.
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
클래스와 구조체의 차이에 대한 질문입니다
AStar 알고리즘에서 구조체를 사용하는 이유가 궁금합니다 이전의 Knight에서 IComparable을 구현할 때는 Class로 구현하였는데 이번 PQNode를 구조체로 구현한 이유가 궁금합니다. 무언가 성능적인 차이가 있는건가요? 찾아보면 기본형이 Private or Public인지의 차이와 1강에서 배운 얕은복사 깊은복사의 차이밖에 없는 것 같은데 그렇다면 Class로 선언해도 동일하게 작동하게 되는건가요? (내용을 수정하여 재업로드 하였습니다)
-
미해결시스템엔지니어가 알려주는 리눅스 실전편 Bash Shell Script
혹시 강의중에 사용하시는 교안은 제공해 주시지않으신가요?
혼자연습할때 유용할듯한데 교안은 따로 제공예정이 없으신가요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
트랜잭셔널 에노테이션에 대해서 질문이 있습니다.
A 서비스 클래스에서 어떠한 메서드(@Transactional 있음)가 하나의 트랜잭션을 실행하는데 B 서비스 클래스에 있는 UPDATE 메서드를 A 서비스 클래스의 해당 메서드에 넣어서 사용한다고 할때 B서비스 클래스의 UPDATE 메서드에 @Transactional 에노테이션이 붙어있어도 문제가 없을까요? B 클래스 메서드가 단독으로 트랜잭션을 실행하지 않는다는 무조건적인 보장이 있으면 에노테이션이 없는 것이 맞지만 그것이 아니라면 에노테이션이 있어야 될것 같아서 질문드립니다.
-
해결됨설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
D F/F gate수와 Cell수의 관계
D F/F gate count = 10 gates라 하셧는데 이게 synthesis 이후에 보이는 cell의 갯수인가요?
-
미해결[신규 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
뉴스 본문 크롤링
안녕하세요!! 이전 질문에 이어서 알려주신 방법을 활용하여 다음 뉴스 url크롤링까지는 성공했는데 뉴스 본문의 css선택자가 네이버와는 다르게 구성되어 있어 본문이 크롤링 되지 않습니다ㅠ 질문 드리기 전에 이방법 저방법 다 해봤는데 몇 시간째 계속 오류만 떠서 머리에 쥐가 날 것 같습니다ㅠ 코드는 아래와 같습니다. import requests from bs4 import BeautifulSoup response = requests.get("https://news.daum.net/breakingnews/politics") html = response.text soup = BeautifulSoup(html, "html.parser") articles = soup.select("div.cont_thumb") # 뉴스 기사 div 10개 추출 for article in articles: links = article.select("a.link_txt") url = links[0].attrs['href'] response = requests.get(url, headers={'User-Agent' : 'Mozila/5.0'}) html = response.text soup = BeautifulSoup(html, 'html.parser') #print(url) content = soup.select_one('#mArticle > #harmonyContainer > section') print(content.text)
-
미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
배열의 처음부터 접근해도 괜찮을까요?
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <vector> #include <algorithm> int main() { freopen("input.txt", "rt", stdin); int cacheSize, tasks; scanf("%d %d", &cacheSize, &tasks); std::vector<int> cacheList(cacheSize, 0); int i = 0; for (int task = 0; task < tasks; task++) { if (i != cacheSize-1) { i++; } int k; int input; int pos = 0; scanf("%d", &input); // Hit 위치를 찾아낸다. for (k = 0; k <= i; k++) { if (cacheList[k] == input) { pos = k; } } // Hit가 없으면 if (pos == 0) { for (k = i - 1; k >= 0; k--) { cacheList[k + 1] = cacheList[k]; } } else { for (k = pos - 1; k >= 0; k--) { cacheList[k + 1] = cacheList[k]; } } cacheList[k + 1] = input; } for (int i = 0; i < cacheSize; i++) { printf("%d ", cacheList[i]); } return 0; } 반복횟수를 줄여보고자 첫 인덱스부터 접근했보았습니다. 괜찮은 코드일까요?
-
미해결아두이노와 떠나는 사물인터넷 여행 - 아두이노 입문부터 IoT 중급까지!
블루투스 강의에서 인터럽트핀
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 강의 잘 듣고 있습니다. 강의 관련 질문 답변 게시판을 찾다가 못찾겠어서 여기 남기는데 맞는지 모르겠습니다. 블루투스 강의에서 인터럽트 핀에서만 소프트웨어시리얼통신할수 있다 하셨는데 핀맵에서 인터럽트 가능 핀은 2,3번 뿐인데, 강의에서 4,5 번으로 할당을 하셔서요.
-
미해결[신규 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
MissingSchema오류
안녕하세요. 덕분에 열심히 공부하고 있습니다. 알려주신 방법을 활용해서 다음뉴스 본문 크롤링을 시도하고 있습니다. for article로 했을 때 url도 가져와지지 않아 url 가져오기는 성공했던 for link 방법으로 url목록을 가져온 후 다시 request를 해서 soup를 프린트해봤는데 html정보를 모두 가져오지 않고, 아래와 같은 오류가 발생합니다. 코드는 오류 아래 붙여넣었습니다. 답변주시면 정말 감사드리겠습니다!! line 16, in <module> response = requests.get(url, headers={'User-agent':'Mozila/5.0'}) File "C:\ProgramData\Anaconda3\lib\site-packages\requests\api.py", line 76, in get return request('get', url, params=params, **kwargs) File "C:\ProgramData\Anaconda3\lib\site-packages\requests\api.py", line 61, in request return session.request(method=method, url=url, **kwargs) File "C:\ProgramData\Anaconda3\lib\site-packages\requests\sessions.py", line 516, in request prep = self.prepare_request(req) File "C:\ProgramData\Anaconda3\lib\site-packages\requests\sessions.py", line 449, in prepare_request p.prepare( File "C:\ProgramData\Anaconda3\lib\site-packages\requests\models.py", line 314, in prepare self.prepare_url(url, params) File "C:\ProgramData\Anaconda3\lib\site-packages\requests\models.py", line 388, in prepare_url raise MissingSchema(error) requests.exceptions.MissingSchema: Invalid URL '/breakingnews/politics': No schema supplied. Perhaps you meant http:///breakingnews/politics? import requests from bs4 import BeautifulSoup response = requests.get("https://news.daum.net/breakingnews/politics") html = response.text soup = BeautifulSoup(html, "html.parser") links = soup.select("a.link_txt") articles = soup.select("div.cont_thumb") # 뉴스 기사 div 10개 추출 for link in links: title = link.text #태그 안에 텍스트 요소를 가져온다 # print(title) url = link.attrs['href'] #href의 속성값을 가져온다 #print(title,url) #print(url) response = requests.get(url, headers={'User-agent':'Mozila/5.0'}) html = response.text soup = BeautifulSoup(html, "html.parser") print(soup)
-
미해결C 프로그래밍 - 입문부터 게임 개발까지
sizeof에서 오류가 나는 것 같아서 물어보고 싶습니다.
#include <stdio.h> int main(void) { char name[256]; printf("이름이 뭐에요? "); scanf_s("%s", name, sizeof(name)); int age; printf("몇살이세요? "); scanf_s("%d", &age); float weight; printf("몸무게는 몇 kg 이에요? "); scanf_s("%f", &weight); double height; printf("키는 몇 cm 이에요? "); scanf_s("%lf", &height); char what[256]; printf("어떤 범죄를 저질렀나요? "); scanf_s("%s", what, sizeof(what)); //조서 내용 출력 printf("\n\n--- 범죄자 정보 ---\n\n"); printf("이름 : %s\n", name); printf("나이 : %d\n", age); printf("몸무게 : %.2f\n", weight); printf("키 : %.2lf\n", height); pirntf("범죄 : %s\n", what); return 0; } 으로 코딩문을 작성했는데 C6328 크기 불일치: 'unsigned __int64'이(가) _Param_(3)으로 전달되었습니다. 다음 호출에는 'unsigned int'이(가) 필요합니다. 'scanf_s'. 라는 오류가 뜨는데 어디가 잘못된건지 잘 모르겠습니다.
-
미해결만들면서 배우는 리액트 : 기초
useState()괄호안에 함수를 넣을때..궁금한점..
궁금한점이 있어요! 컴포넌트 함수의 속성값을 받아올때는 { }중괄호를 사용하여 함수값을 호출하는데 useState()괄호안에 파라미터값을 적용할때에 useState({CAT1})이 아니라 useState(CAT1)으로 선언하는 이유를 알 수 있을까요..ㅠㅠㅠㅠ
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
express.static 질문드리고 싶습니다
강사님 안녕하세요 현재 폴더에 kkk라는 폴더를 만들었습니다 kkk 폴더 내에도 필요한 파일들을 채웠습니다 여기서 제가 실험을 해봤습니다 kkk 폴더에서 cookie2.html을 지웠습니다 그런데 이렇게 하고 실행해봤더니 cookie2.html을 잘 불러왔습니다 혹시 제가 잘못 이해하고 있는 부분이 있는 것 같아서 질문드리고 싶습니다 가르쳐주시면 감사하겠습니다
-
미해결설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
gedit 말고 vim 으로 해보려고 하는데요...
일단 설치는 했고 실행도 했습니다만 vim에 관해 아예 모르는 상황에서 이 수업 내용의 vim내용만으로도 따라잡을 수 있을지 염려되어 여쭤봅니다
-
미해결[리뉴얼] 코딩자율학습 제로초의 자바스크립트 입문
addEventListener 이전 예제와 비교
이전 쿵쿵따나 끝말잇기에서 $button.addEventListener('click', onClickButton); 도 리턴값이 없어 undefined 를 반환하는데 왜 버튼을 누르면 실행이 되는지 궁금합니다. $document.queyrSelector(#num-0).addEventListener('click', onClickNumber('0')); 여기서는 매개변수를 썼기 때문에 함수 자체를 쓴 게 아니라 함수 반환값을 쓴 것인가요?? 이전 쿵쿵따, 끝말잇기 addEventListener 코드와 이번 코드의 다른 점이 무엇인지 궁금합니다..ㅠㅠ 만약 위처럼 이해한 게 맞다면, 자바스크립트에서는 함수에 매개변수가 있어야 할 경우 모두 함수를 반환하는 고차함수로 작성해야 하나요??
-
미해결[개정판] 파이썬 머신러닝 완벽 가이드
ValueError: x and y must have same first dimension, but have shapes (53,) and (144,) 와 Input contains NaN, infinity or a value too large for dtype('float64'). 에러 두 가지
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 강의 내용을 질문할 경우 몇분 몇초의 내용에 대한 것인지 반드시 기재 부탁드립니다. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 3장 평가 부분 공부하면서 두 가지 에러가 나서 문의합니다. 개념부분 설명하며 코드 작성할 때는 잘 되었는데, 당뇨병 데이터 가지고 실습 예제하는 중에는 빨갛게 표시된 부분에 해당 에러가 발생합니다. 전체 코드를 올리니 답변 부탁드립니다! ^^ # 분류의 성능 평가지표 - 이진 분류: 긍정/부정과 같은 2개의 결괏값만을 가짐(아래의 성능 지표는 이진 분류에서 특히 중요하게 강조하는 지표임) - 멀티 분류: 여러 개의 결정 클래스 값을 가짐 ## 정확도 accuracy ## 오차행렬 confusion matrix ## 정밀도, 재현율 precision, recall ## F1 score ## ROC AUC ## 1. 정확도 : 실제 데이터에서 예측 데이터가 얼마나 같은지 판단하는 지표 예측 결과가 동일한 데이터 건수/전체 예측 데이터 건수 왜곡이 발생할 수 있음 from sklearn.base import BaseEstimator class MyDummyClassifier(BaseEstimator): # 학습하지 않은 경우에도 높은 확률을 보일 수 있다! 주의!! def fit(self, X, y=None): pass def predict(self, X): pred=np.zeros((X.shape[0], 1)) for i in range(X.shape[0]): if X['Sex'].iloc[i] == 1: pred[i]=0 else: pred[i]=1 return pred import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score from sklearn import preprocessing titanic_df= pd.read_csv('./train.csv') def encode_features(dataDF): features=['Cabin', 'Sex', 'Embarked'] for feature in features: le = preprocessing.LabelEncoder() le = le.fit(dataDF[feature]) dataDF[feature] = le.transform(dataDF[feature]) return dataDF titanic_df = encode_features(titanic_df) titanic_df.head() def fillna(df): df['Age'].fillna(df['Age'].mean(), inplace=True) df['Cabin'].fillna('N', inplace=True) df['Embarked'].fillna('N', inplace =True) df['Fare'].fillna(0, inplace=True) return df def drop_features(df): df.drop(['PassengerId', 'Name', 'Ticket'], axis=1, inplace=True) return df def format_features(df): df['Cabin'] = df['Cabin'].str[:1] features=['Cabin', 'Sex', 'Embarked'] for feature in features: le = LabelEncoder() le=le.fit(df[feature]) df[feature] = le.transform(df[feature]) return df def transform_features(df): df=fillna(df) df= drop_features(df) df= format_features(df) return df titanic_df = pd.read_csv('./train.csv') y_titanic_df = titanic_df['Survived'] X_titanic_df = titanic_df.drop('Survived', axis=1) X_titanic_df X_titanic_df= transform_features(X_titanic_df) X_titanic_df X_train, X_test, y_train, y_test = train_test_split(X_titanic_df, y_titanic_df, test_size=0.2, random_state=0) myclf= MyDummyClassifier() myclf.fit(X_train, y_train) mypredictions= myclf.predict(X_test) print(accuracy_score(y_test, mypredictions)) from sklearn.datasets import load_digits from sklearn.model_selection import train_test_split from sklearn.base import BaseEstimator from sklearn.metrics import accuracy_score import numpy as np import pandas as pd class MyFakeClassifier(BaseEstimator): def fit(self, X, y): pass def predict(self, X): return np.zeros((len(X), 1), dtype=bool) digits= load_digits() y=(digits.target==7).astype(int)#True라면 astype(int)로 1로 변환, 아니면 False니 0으로 변환 X_train, X_test, y_train, y_test = train_test_split(digits.data, y, random_state=11) print(y_test.shape) print(pd.Series(y_test).value_counts()) fakeclf= MyFakeClassifier() fakeclf.fit(X_train, y_train) fakepred= fakeclf.predict(X_test) print(accuracy_score(y_test, fakepred)) # 따라서 불균형한 lableSets에서는 평가수치로 사용돼서는 안 된다!!!! # 2. 오차행렬 confusion matrix - 학습된 분류 모델이 예측을 수행하면서 얼마나 헷갈리고 있는지 함께 보여주는 지표다 - 이진 분류의 예측 오류 얼마인지? + 어떠한 유형의 예측 오류가 발생하고 있는지? - TN FP - FN TP ## 정확도 * (TN+ TP)/(TN+FP+FN+TP) * 불균형한 레이블 세트에서는 * 매우 적은 수의 결과값에 positive를 설정해 1값을 부여하고, 그렇지 않은 경우는 negative로 0값을 부여하는 경우가 많다. ## 정밀도 * TP / (FP+TP) * 예측을 Positive로 한 대상 중 예측과 실제 값이 Positive로 일치한 데이터의 비율 * Positive 예측 성능을 더욱 정밀하게 측정하기 위한 평가 지표 * 양성 예측도 * 언제 중요한가? 실제 nagative 데이터를 positive데이터로 판단하면 안되는 경우 (가짠데 진짜라고 판단하면 안되는 경우) * FP 낮추는 데 초점을 둔다!!!!!! ## 재현율 recalls * TP/(FN+TP) * 실제값이 Positive인 대상 중 * 예측과 실제 값이 Positive로 일치한 데이터의 비율 * 민감도 Sensitivity 또는 TPR True positive rate * 언제 중요하는가? 실제 positive 양성 데이터를 nagative로 잘못 판단하면 안되는 경우 (진짠데 가짜라고 판단하면 안되는 경우) * FN 낮추는데 초점을 둔다!!!!!!!! ### Trade-off - 분류의 결정 임곗값 Threshold를 조정해 정밀도 또는 재현율의 수치를 높일 수 있다. - 그런데 이들은 상호 보완적인 평가 지표라서 어느 한쪽을 강제로 높이면, 다른 하나의 수치는 떨어진다. # 정확도 from sklearn.metrics import confusion_matrix confusion_matrix(y_test, fakepred) # 정밀도, 재현율 from sklearn.metrics import accuracy_score, precision_score, recall_score, confusion_matrix def get_clf_eval(y_test, pred): confusion= confusion_matrix(y_test, pred) accuracy= accuracy_score(y_test, pred) precision= precision_score(y_test, pred) recall= recall_score(y_test, pred) print(confusion) print(f"정확도:{accuracy}, 정밀도:{precision}, 재현율:{recall}") import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression titanic_df = pd.read_csv('./train.csv') y_titanic_df = titanic_df['Survived'] X_titanic_df = titanic_df.drop('Survived', axis=1) X_titanic_df = transform_features(X_titanic_df) X_train, X_test, y_train, y_test = train_test_split(X_titanic_df, y_titanic_df, test_size= 0.20, random_state = 11) lr_clf= LogisticRegression() lr_clf.fit(X_train, y_train) pred = lr_clf.predict(X_test) print(y_test.shape) print(pred.shape) get_clf_eval(y_test, pred) # trade-off # predict_proba() 반환결과: 예측 확률 결과 # predict() 반환 결과: 예측 결과 클래스값 pred_proba = lr_clf.predict_proba(X_test) pred = lr_clf.predict(X_test) print(pred_proba.shape) print(pred_proba[:3]) pred_proba_result = np.concatenate([pred_proba, pred.reshape(-1, 1)], axis=1) print(pred_proba_result[:3]) from sklearn.preprocessing import Binarizer X=[[1, -1, 2], [2,1,4], [2,2,-2]] binarizer= Binarizer(threshold=1.1) print(binarizer.fit_transform(X)) custom_threshold= 0.5 pred_proba_1 = pred_proba[:, 1].reshape(-1,1) binarizer = Binarizer(threshold=custom_threshold).fit(pred_proba_1) custom_predict = binarizer.transform(pred_proba_1) get_clf_eval(y_test, custom_predict) custom_threshold= 0.3 pred_proba_1 = pred_proba[:, 1].reshape(-1,1) binarizer = Binarizer(threshold=custom_threshold).fit(pred_proba_1) custom_predict = binarizer.transform(pred_proba_1) get_clf_eval(y_test, custom_predict) # 잘모르겠는 부분 임곗값에 따라 정밀도와 재현율이 달라지는 이유?가 잘 이해가 안됨! thresholds= [0.4, 0.5, 0.6, 0.7] def get_eval_by_threshold(y_test, pred_proba_c1, thresholds): for custom_threshold in thresholds: binarizer= Binarizer(threshold = custom_threshold).fit(pred_proba_c1) custom_predict= binarizer.transform(pred_proba_c1) print(custom_threshold) get_clf_eval(y_test, custom_predict) get_eval_by_threshold(y_test, pred_proba[:, 1].reshape(-1,1), thresholds) # precision_recall_curve() from sklearn.metrics import precision_recall_curve pred_proba_class1 = lr_clf.predict_proba(X_test)[:,1] precisions, recalls, thresholds = precision_recall_curve(y_test, pred_proba_class1) print(thresholds.shape) thr_index = np.arange(0, thresholds.shape[0], 15) print(thr_index) print(np.round(thresholds[thr_index], 2)) print(f"정밀도{np.round(precisions[thr_index], 3)}") print(f"재현율{np.round(recalls[thr_index], 3)}") import matplotlib.pyplot as plt import matplotlib.ticker as ticker %matplotlib inline def precision_recall_curve_plot(y_test, pred_proba_c1): precision, recalls, threshold = precision_recall_curve(y_test, pred_proba_c1) plt.figure(figsize=(8,6)) threshold_boundary = threshold.shape[0] plt.plot(thresholds, precisions[0:threshold_boundary], linestyle='--', label='precision') plt.plot(thresholds, recalls[0:threshold_boundary], label='recall') start, end = plt.xlim() plt.xticks(np.round(np.arange(start, end, 0.1),2)) plt.xlabel('Threshold value') plt.ylabel('Precision and recall value') plt.legend() plt.grid() plt.show() precision_recall_curve_plot(y_test, lr_clf.predict_proba(X_test)[:, 1]) # F1 스코어 - F1 score는 정밀도와 재현율을 결합한 지표로서 둘이 어느 한 쪽으로 치우치지 않는 수치를 나타낼 때 상대적으로 높은 값을 가짐 #F1 score from sklearn.metrics import f1_score f1 = f1_score(y_test, pred) print(f1) def get_clf_eval(y_test, pred): confusion = confusion_matrix(y_test, pred) accuracy = accuracy_score(y_test, pred) precision= precision_score(y_test, pred) recall = recall_score(y_test, pred) f1= f1_score(y_test, pred) print(confusion) print(accuracy, precision, recall, f1) thresholds = [0.4, 0.45, 0.50, 0.55, 0.60] pred_proba = lr_clf.predict_proba(X_test) get_eval_by_threshold(y_test, pred_proba[:,1].reshape(-1, 1), thresholds) # ROC곡선 - 이진 분류의 예측 성능 측정에서 중요하게 사용되는 지표 - Receiver Operation characteristic curve 수신자 판단 곡선 - FPR False Positive Rate 이 변할 때, TPR 재현율=민감도 True Positive Rate이 어떻게 변하는지 나타내는 곡선 - TPR <-> TNR 특이성 Specificity True Negative Rate, - FPR= 1-TNR, 1-특이성 from sklearn.metrics import roc_curve pred_proba_class1 = lr_clf.predict_proba(X_test)[:,1] fprs, tprs, thresholds = roc_curve(y_test, pred_proba_class1) print(thresholds) #thresholds[0]은 max예측확률+1로 임의 설정된다. 이를 제외하기 위해 np.arange는 1부터 시작한다. thr_index=np.arange(1, thresholds.shape[0],5) print(thr_index) print(np.round(thresholds[thr_index],2)) def roc_curve_plot(y_test, pred_proba_c1): fprs, tprs, thrsholds = roc_curve(y_test, pred_proba_c1) plt.plot(fprs, tprs, label = 'ROC') plt.plot([0,1], [0,1], 'k--', label='Random') start, end= plt.xlim() plt.xticks(np.round(np.arange(start, end, 0.1),2)) plt.xlim(0,1) plt.ylim(0,1) plt.xlabel('FPR(1-Sensitivity)') plt.ylabel('TPR(recall)') plt.legend() roc_curve_plot(y_test, pred_proba[:,1]) # AUC - ROC 곡선 자체는 FPR과 TPR의 변화 값을 보는 데 이용하며 분류의 성능 지표로 사용되는 것은 ROC 곡선 면적에 기반한 AUC값으로 결정한다. AUC 값은 ROC 곡선 밑의 면적을 구한 것으로 일반적으로 1에 가까울 수록 좋은 수치다. -Area Under Curve - AUC 수치가 커지려면 FPR이 작은 상태에서 얼마나 큰 TPR을 얻을 수 있느냐가 관건이다. 직사각형에 가까운 곡선! from sklearn.metrics import roc_auc_score pred_proba = lr_clf.predict_proba(X_test)[:,1] roc_score = roc_auc_score(y_test, pred_proba) print(roc_score) def get_clf_eval(y_test, pred=None, pred_proba= None): confusion = confusion_matrix(y_test, pred) accuracy = accuracy_score(y_test, pred) precision= precision_score(y_test, pred) recall = recall_score(y_test, pred) f1= f1_score(y_test, pred) roc_auc= roc_auc_score(y_test, pred_proba) print(confusion) print(accuracy, precision, recall, f1, roc_auc) get_clf_eval(y_test, pred, pred_proba) #prediction about pima inidans diabetes #inline: 브라우저 내부(inline)에 바로 그려지도록 해주는 코드 import numpy as np import pandas as pd import matplotlib.pyplot as plt %matplotlib inline from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score, precision_score, recall_score, roc_auc_score from sklearn.metrics import f1_score, confusion_matrix, precision_recall_curve, roc_curve from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression diabetes_data = pd.read_csv('diabetes.csv') print(diabetes_data['Outcome'].value_counts()) diabetes_data.head(3) diabetes_data.info() X= diabetes_data.iloc[:, :-1] X y= diabetes_data.iloc[:, -1] y X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state = 156, stratify=y) #stratify(층을 이룬다) : 지정한 Data의 비율을 유지한다. 예를 들어, Label Set인 Y가 25%의 0과 75%의 1로 이루어진 Binary Set일 때, # stratify=Y로 설정하면 나누어진 데이터셋들도 0과 1을 각각 25%, 75%로 유지한 채 분할된다. lr_clf = LogisticRegression() lr_clf.fit(X_train, y_train) pred = lr_clf.predict(X_test) pred_proba = lr_clf.predict_proba(X_test)[:, 1] get_clf_eval(y_test, pred, pred_proba) pred_proba_c1 = lr_clf.predict_proba(X_test)[:, -1] print(pred_proba_c1.shape) print(y_test.shape) precision_recall_curve_plot(y_test, pred_proba_c1) ValueError: x and y must have same first dimension, but have shapes (53,) and (144, diabetes_data.describe() # bins 파라미터는 히스토그램의 가로축 구간의 개수를 지정 # cumulative는 누적히스토그램 plt.hist(diabetes_data['Glucose'], cumulative=False, bins=10) plt.hist(diabetes_data['Glucose'], bins=15) zero_features = ['Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI'] total_count = diabetes_data['Glucose'].count() for feature in zero_features: zero_count = diabetes_data[diabetes_data[feature]==0][feature].count() print(feature) print(zero_count) print(f'{feature}은 0인 데이터 계수가 {zero_count}이므로 퍼센트는 {100*zero_count/total_count}') mean_zero_features=diabetes_data[zero_features].mean() mean_zero_features diabetes_data[zero_features]= diabetes_data[zero_features].replace(0, mean_zero_features) diabetes_data[zero_features].head(10) X=diabetes_data.iloc[:, :-1] y = diabetes_data.iloc[:, -1] scaler=StandardScaler() X_scaled = scaler.fit_transform(X) X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state= 156, stratify=y) lr_clf= LogisticRegression() lr_clf.fit(X_train, y_train) pred= lr_clf.predict(X_test) pred_proba = lr_clf.predict_proba(X_test)[:, 1] get_clf_eval(y_test, pred, pred_proba) precision_recall_curve_plot(y_test, pred_proba) ValueError: x and y must have same first dimension, but have shapes (53,) and (144,) thresholds=[0.3, 0.33, 0.36, 0.39, 0.42, 0.45] pred_proba = lr_clf.predict_proba(X_test) def get_eval_by_threshold(y_test, pred_proba_c1, thresholds): for custom_threshold in thresholds: binarizer= Binarizer(threshold = custom_threshold).fit(pred_proba_c1) custom_predict= binarizer.transform(pred_proba_c1) print(custom_threshold) get_clf_eval(y_test, custom_predict) get_eval_by_threshold(y_test, pred_proba[:, 1].reshape(-1,1), thresholds) Input contains NaN, infinity or a value too large for dtype('float64'). binarizer=Binarizer(threshold=0.48) pred_th_048=binarizer.fit_transform(pred_proba[:, 1].reshape(-1,1)) get_clf_eval(y_test, pred_th_048, pred_proba[:, 1])
-
미해결초보자도 만들 수 있는 스크롤 인터렉션. 1편 자바스크립트
8강 자바스크립트 버전이없어요
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
Spring을 공부하면서 애플리케이션 영역에서 트랜잭션을 적용을 권고하는 사유가 있을지 궁금합니다.
이전에 닷넷 + MSSQL개발 환경에서는 트랜잭션을 애플리케이션 영역이 아닌 프로시저 내에서(쿼리문 영역) 트랜잭션 설정하는것을 권고했었는데요. Spring 환경으로 넘어가면서 동일한 MSSQL사용하지만 애플리케이션 설정하는것을 권고하더라구요. 도저히 이 부분에 대해서 왜 어플리케이션 영역에서 설정해야 하는지 이유를 잘 모르겠습니다. 감사합니다.
-
해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
express body-parser에 대해 질문드리고 싶습니다
강사님 안녕하세요 body-parser에 대해 질문드리고 싶습니다 소스코드는 지난번에 질문드렸던 소스코드에서 bodyParser를 이용하는 소스코드를 추가했습니다 const express = require('express'); const path = require('path'); const { nextTick, rawListeners } = require('process'); const morgan = require('morgan'); const cookieParser = require('cookie-parser'); const bodyParser = require('body-parser'); const app = express(); app.set('port', process.env.PORT || 3000); //'port' 라는 속성에 포트번호 3000번을 설정합니다. //서버의 포트를 3000번으로 지정합니다. //app.use(morgan('dev')); //쿠키를 객체화 시킵니다. app.use(cookieParser()); //cookieparser를 사용하기 위해 app.use(express.json()); app.use(express.urlencoded({extended: true})); //post요청에 의한 req.body를 사용하기 위해서 //login 경로의 경우입니다. app.get('/login', (req, res, next) => { req.cookies // 쿠키 객체화 a=req.query; b=req.params; c=req.body; console.log("req.query "+req.query); console.log("req.params "+req.params); console.log("req.body "+req.body); console.log("req.query.name "+req.query.name); console.log("req.params.name "+req.params.name); console.log("req.body.name "+req.body.name); // expires.setMinutes(expires.getMinutes() + 5); const expires = new Date(); expires.setMinutes(expires.getMinutes() + 5); res.cookie('name', encodeURIComponent(req.query.name),{ expires: expires, httpOnly: true, path: '/', }) res.redirect('/'); }); app.get('/', (req,res)=>{ console.log("req.url "+req.url); if(req.cookies.name)//name이라는 쿠키가 있는 경우입니다. { //res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' }); res.send(`${req.cookies.name}님 안녕하세요`);//쿠키에 넣은 이름이 웹페이지에 출력됩니다 } else{ //로그인도 아니고, 쿠키도 없는 경우입니다. //next(createError(404)); try { // console.log("진입"); //res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' }); //익스프레스에서는 writeHead를 쓰면 안된다 에러가 생긴다 //res.send( ) 할 때 이미 자동으로 res.status().send() 이런 식으로 헤더를 설정해준다 //res.sendFile(path.join(__dirname, '/cookie2.html'));//cookie2.html 파일을 클라이언트에게 보내준다 //console.log(err.status) console.log("진입"); res.setHeader('Content-Type', 'text/html'); //익스프레스에서는 writeHead를 쓰면 에러가 생긴다 그러므로 setHeader를 써라 res.sendFile(path.join(__dirname, 'cookie2.html')); //cookie2.html 파일을 클라이언트에게 보내준다 } catch (err) { // res.writeHead(500, { 'Content-Type': 'text/plain; charset=utf-8' }); // res.end(err.message); next(err); //콜백함수에 err 라는 인자가 있는 app.use로 이동한다 } } }); // app.get('/:id',(req,res)=>{ // console.log("req.url "+req.url); // console.log("req.params.id "+req.params.id); // res.send(`Hello ${req.params.id}`); // }) //아래는 에러처리입니다. app.use((req,res,next)=>{ // 찾는 경로가 없으면 get을 다 지나서 use로 온다 console.log("req.url "+req.url); next(createError(404)); //찾는 경로가 없으면 404처리 }) app.use((err,req,res,next)=>{ // /favicon.ico도 여기로 간다 에러도 여기로 간다 console.log("req.url "+req.url); console.log(res.locals.message); res.locals.message = err.message; res.locals.error = req.app.get(`env`) === `development` ? err:{}; console.log(err.status) res.status(err.status ||500).send(err.message); }); app.listen(3000, () => { console.log(app.get('port'), '번 포트에서 서버 대기 중입니다!'); }); 그런데 name 이 Hello를 잡아주는 것은 req.query.name 은 잡아줬는데 req.body.name 은 잡아주지 못했습니다 그 이유가 궁금해서, 공식문서도 찾아보고 강사님의 POST PUT DELETE 요청 보내기 강의도 다시 찾아봤습니다 [리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지 - 인프런 | 학습 페이지 (inflearn.com) 익스프레스 body-parser의 req.body 는 axios.post('경로',{ name }) 이런 식으로 axios.post의 2번째 인자만 받아주는 건가 싶었습니다 질문 드리기 전에 좀 더 충분히 찾아보기 위해서 WEB3 - Express - 9.1. 미들웨어의 사용 - body parser - YouTube생활코딩님 채널의 유튜브 강의도 참고해봤는데, axios.post('경로',{ name }) 로 보내주지 않아도 form 태그로 전송해준 속성들은 다 받아주는 것 같았습니다 혹시 req.query.name은 hello을 받아주는데 req.body.name은 hello를 못받아주고 req.body는 빈 객체가 되는 이유가 이해하기 어려워서 가르쳐주시면 감사하겠습니다
-
해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
res.send와 favicon에 대해 질문드리고 싶습니다
강사님 안녕하세요 약간 햇갈리는 부분이 있어서 질문드리고 싶습니다 http://localhost:3000/ 을 입력하면 req.url이 처음에는 /이고 마지막에는 /favicon.ico 가 되어서요 그래서 제가 63행에 저 라우터를 넣으면 req.url이 처음에는 / 일 때, cookie2.html이 웹페이지에 나온 다음에 마지막에는 /favicon.ico 때문에 웹브라우저 페이지에는 Hello favicon 으로 변경될 줄 알았습니다 그런데, 웹페이지가 안바뀌고 cookie2.html 이 그대로 유지되는 이유가 이해가 어려워서 질문드리고 싶습니다 가르쳐주시면 감사하겠습니다
-
미해결[리뉴얼] 파이썬입문과 크롤링기초 부트캠프 [파이썬, 웹, 데이터 이해 기본까지] (업데이트)
크롤링 프로그램 오나성: 크롤링한 데이터에서 다시 크롤링하기2
계속 오류나서 보니 작성해주신 파일 보니 아래 조건문이 추가되어있네요. 왜 추가해야되는지 이해를 못하겠어서 공지사항 보려고 하는데, 못찾겠습니다. 어디로 들어가면 될지요 ㅠ link_re = re.compile('^http://') ..... if link_re.match(title['href']):