0

숫자 기능과 텍스트 기능 모두를 기반으로 benign 또는 malicious 클래스에 속하는 URL의 확률을 예측하기 위해 감독 대상 컴퓨터 학습 모델을 만들려고합니다.기계 학습을위한 교육 세트에서 텍스트 및 수치 기능을 결합하는 방법은 무엇입니까?

수치 특징 목록-

  • 길이 주 도메인의 URL의

    • 길이
    • 가 IP 등을 포함 도트의 수

    텍스트 특징 -

    을등록의 6,는
    • 이름
    • URL의 단어 등록자의
    • 이름
    • 나라
    • 목록 등

    내가 필요한 기능을 dataframe을 가지고 있지만 어떻게 해야할지 모르겠어요 텍스트 데이터. 누군가 나를 인도 할 수 있습니까?

    아래는 내가 사전에

    url_length length_domain is_ip registrar registrants tokens_in_url 
    0  50    18   0   a1   z1  [abc, def, ghi, jkl] 
    1  98    23   0   a2   z2  [mno, pqr, stu] 
    2  146    8   0   a3   z3  [vwx, yz] 
    

    감사 안좋다 있다는 샘플 dataframe입니다.

    소스 DF :

  • +2

    사용 OneHotEncoder는 범주 데이터입니다. 참조 용 [OneHotEncoder] (http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html#sklearn-preprocessing-onehotencoder) @NileshShaikh –

    +0

    데이터의 기능을 분석 할 수도 있습니다 http://scikit-learn.org/stable/auto_examples/ensemble/plot_forest_importances.html의 도움을 받아 타겟에 기여할 수 있습니다. 물론 일반적인 주파수 분포, 상관 관계 등을 수행 할 것입니다. –

    답변

    1

    은 다음과 데모를 고려

    In [113]: df 
    Out[113]: 
        registrar registrant country 
    0 registrar1 registrant1 country1 
    1 registrar8 registrant2 country2 
    2 registrar1 registrant3 country1 
    3 registrar5 registrant4 country3 
    

    인코딩 :

    In [114]: from sklearn.preprocessing import LabelEncoder 
    
    In [115]: str_cols = df.columns[df.dtypes.eq('object')] 
    
    In [116]: clfs = {c:LabelEncoder() for c in str_cols} 
    
    In [117]: for col, clf in clfs.items(): 
        ...:  df[col] = clfs[col].fit_transform(df[col]) 
        ...: 
    
    In [118]: df 
    Out[118]: 
        registrar registrant country 
    0   0   0  0 
    1   2   1  1 
    2   0   2  0 
    3   1   3  2 
    

    역 변환 :

    In [119]: clfs['country'].inverse_transform(df['country']) 
    Out[119]: array(['country1', 'country2', 'country1', 'country3'], dtype=object) 
    

    UPDATE :

    은 당신의 주어진 대답 TF-IDF (URL 단어 목록)를 사용할 수 있습니까? 텍스트 기능에 대한

    In [86]: from sklearn.feature_extraction.text import TfidfVectorizer 
    
    In [87]: vect = TfidfVectorizer(sublinear_tf=True, max_df=0.5, analyzer='word', stop_words='english') 
    
    In [88]: X = vect.fit_transform(df['tokens_in_url'].str.join(' ')) 
    
    In [89]: X 
    Out[89]: 
    <3x9 sparse matrix of type '<class 'numpy.float64'>' 
         with 9 stored elements in Compressed Sparse Row format> 
    
    In [90]: X.A 
    Out[90]: 
    array([[ 0.5  , 0.5  , 0.5  , 0.5  , 0.  , 0.  , 0.  , 0.  , 0.  ], 
         [ 0.  , 0.  , 0.  , 0.  , 0.57735027, 0.57735027, 0.57735027, 0.  , 0.  ], 
         [ 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.70710678, 0.70710678]]) 
    
    
    In [91]: vect.get_feature_names() 
    Out[91]: ['abc', 'def', 'ghi', 'jkl', 'mno', 'pqr', 'stu', 'vwx', 'yz'] 
    
    In [92]: tok = pd.SparseDataFrame(X, columns=vect.get_feature_names(), index=df.index, default_fill_value=0) 
    
    In [93]: tok 
    Out[93]: 
        abc def ghi jkl  mno  pqr  stu  vwx  yz 
    0 0.5 0.5 0.5 0.5 0.00000 0.00000 0.00000 0.000000 0.000000 
    1 0.0 0.0 0.0 0.0 0.57735 0.57735 0.57735 0.000000 0.000000 
    2 0.0 0.0 0.0 0.0 0.00000 0.00000 0.00000 0.707107 0.707107 
    
    +0

    Bit lost on 이 한 친구. 이것은 실제로 기계 학습을위한 최선의 방법으로 숫자와 텍스트 입력을 결합합니까? – roganjosh

    +0

    @roganjosh, 아마도 그렇지 않습니다. 다른 열에 너무 많은 값이있는 경우 유용 할 수 있습니다 ... – MaxU

    +0

    나는 이것이 조금 넓다고 생각한다. 국가를 범주로 사용할 수는 있지만 데이터 준비만큼 모델 선택이 중요하다고 생각합니다. – roganjosh