python 機器學習


<一>:特征工程:將原始數據轉化為算法數據

一:特征值抽取

1:對字典數據 :from sklearn.feature_extraction import DictVectorizer

import pandas as pd
import numpy as np

from sklearn.feature_extraction import DictVectorizer

def dict_func():
    '''
    將字典數據做特征抽取(類別默認進行one-hot編碼)
    :return:None 
    '''
    dict_ = [{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}]
    dv = DictVectorizer(sparse=False)
    data = dv.fit_transform(dict_)
    print(data)                           #  獲取轉化后的數據    (類別問題 已經進行過one-hot編碼)
    print(dv.get_feature_names())         #  獲取特征名
    print(dv.inverse_transform(data))     #  將轉化后的數據轉化為原數據
    '''
    data: [[  0.   1.   0. 100.]
     [  1.   0.   0.  60.]
     [  0.   0.   1.  30.]]
     
    特征名: ['city=上海', 'city=北京', 'city=深圳', 'temperature']
    
    原數據:[{'city=北京': 1.0, 'temperature': 100.0}, {'city=上海': 1.0, 'temperature': 60.0}, {'city=深圳': 1.0, 'temperature': 30.0}]
    '''

 

2:對文本特征抽取:from sklearn.feature_extraction.text import CountVectorizer

def text_func():
    '''
    將文本數據做特征抽取 (默認單個字母或中文不加入特征)
    :return:None
    '''
    text = '隨着自然語言處理領域的頂級盛會 ACL 2019 落幕,亞馬遜 Alexa AI 的機器學習科學家 Mihail Eric 對本次會議進行了一次比較全面的回顧。從奇聞軼事到學術前沿,本文一網打盡,自然語言處理領域的小伙伴們不要錯過!'
    text_jieba = jieba.cut(text)
    a = list(text_jieba)
    text_data = ' '.join(a)    #   隨着 自然語言 處理 領域 的 頂級 盛會   ACL   2019   落幕 , 亞馬遜   Alexa   AI   的 機器 學習 科學家   Mihail   Eric   對 本次 會議 進行 了 一次 比較 全面 的 回顧 。 從 奇聞 軼事 到 學術前沿 , 本文 一網打盡 , 自然語言 處理 領域 的 小伙伴 們 不要 錯過 !

    cv = CountVectorizer()
    data = cv.fit_transform([text_data,])
    print(cv.get_feature_names())
    print(data.toarray())     #  將數據轉化為array類型
    '''
    結果:
    ['2019', 'acl', 'ai', 'alexa', 'eric', 'mihail', '一次', '一網打盡', '不要', '亞馬遜', '會議', '全面', '回顧', '處理', '奇聞', '學習', '學術前沿', '小伙伴', '本文', '本次', '機器', '比較', '盛會', '科學家', '自然語言', '落幕', '軼事', '進行', '錯過', '隨着', '頂級', '領域']
    [[1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2]]
    '''
    return None

 

3:TF-IDF表示詞在全文中的重要性(結果顯示為概率值)    :from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer

def tfidf_func():
    '''
    TF-IDF表示詞在全文中的重要性(結果顯示為概率值)
    :return:
    '''
    text = ["life is short,i like python", "life is too long,i dislike python"]
    tf = TfidfVectorizer()
    data = tf.fit_transform(text)
    print(tf.get_feature_names())
    print(data.toarray())
    '''
    特征名:['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
    占全文概率:  [[0.         0.37930349 0.37930349 0.53309782 0.         0.37930349
      0.53309782 0.        ]
     [0.47042643 0.33471228 0.33471228 0.         0.47042643 0.33471228
      0.         0.47042643]]
    '''
    return None

 

二:特征值預處理

1:歸一化

歸一化首先在特征(維度)非常多的時候,可以防止某一維或某幾維對數據影響過大,也是為了把不同來源的數據統一到一個參考區間下,容易受異常數據的影響(比如某個值異常大或異常小)。常用的方法是通過對原始數據進行線性變換把數據映射到[0,1]之間

公式:

    

注:作用於每一列,max為一列的最大值,min為一列的最小值,那么X’為最終結果,mx,mi分別為指定區間值默認mx為1,mi為0

 
         
from sklearn.preprocessing import MinMaxScaler,StandardScaler
def minmaxscaler():
    """
    歸一化:默認是將數據轉化為 0-1 之間的數據
    :return:
    """
    num = [[90,2,10,40],[60,4,15,45],[75,3,13,46]]
    mm = MinMaxScaler()
    data = mm.fit_transform(num)
    print(data)
    '''
    data:
    [[1.         0.         0.         0.        ]
     [0.         1.         1.         0.83333333]
     [0.5        0.5        0.6        1.        ]]
    '''
    return None

 

2 :標准化

特點:通過對原始數據進行變換把數據變換到均值為0,方差為1范圍內,解決了異常數據的影響

公式:

注:作用於每一列,mean為平均值,𝜎為標准差(考量數據的穩定性)

from sklearn.preprocessing import MinMaxScaler,StandardScaler
def standerscaler():
    """
    標准化處理
    :return:
    """
    num = num = [[90,2,10,40],[60,4,15,45],[75,3,13,46]]
    std = StandardScaler()
    data = std.fit_transform(num)
    print(data)
    '''
    結果:
    [[ 1.22474487 -1.22474487 -1.29777137 -1.3970014 ]
     [-1.22474487  1.22474487  1.13554995  0.50800051]
     [ 0.          0.          0.16222142  0.88900089]]
    '''
    
    return None

 

3:缺失值處理

from sklearn.preprocessing import MinMaxScaler,StandardScaler,Imputer
def im_extract():
    '''
    缺失值處理
    '''
    a = [[np.nan,2,10,40],[88,4,15,45],[75,3,13,np.nan]]

    cv = Imputer(smissing_values="NaN", strategy="mean",axis=0, verbose=0, copy=True)    #  將缺失值填充為mean
    data = cv.fit_transform(a)
    print(data)

4:PCA 降維

PCA(Principal component analysis),主成分分析。特點是保存數據集中對方差影響最大的那些特征,PCA極其容易受到數據中特征范圍影響,所以在運用PCA前一定要做特征標准化,這樣才能保證每維度特征的重要性等同。

from sklearn.decomposition import PCA
def pca_extract():
    #  降維
    a = [[88, 2, 10, 40], [88, 4, 15, 45], [75, 3, 13,50]]

    cv = PCA(n_components=None)
    data = cv.fit_transform(a)
    print(data)

 

5:特征選擇

 

 
         
from sklearn.feature_selection import VarianceThreshold
def vt_func():
    """"
    特征選擇,刪除低方差特征
    """
    x = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]
    std = StandardScaler()
    vt = VarianceThreshold(threshold=(.8 * (1 - .8)))   # 移除那些超過80%的數據都為1或0的特征
    data = vt.fit_transform(x)
    print(data)
    '''
        [[0 1]
         [1 0]
         [0 0]
         [1 1]
         [1 0]
         [1 1]]
    '''

    return None

 

<三> 算法評估器

1:k-近鄰算法

歐式公式:

from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris,fetch_20newsgroups
def K_iris():
    """
    K 近鄰 預測花種類
    :return:
    """
    ir = load_iris()
    # 1 切割數據集
    x_train,x_test,y_train,y_test =train_test_split(ir.data,ir.target,test_size=0.25)

    # 2 對數據標准化處理
    std = StandardScaler()
    x_train = std.fit_transform(x_train)
    x_test = std.transform(x_test)

    # 算法評估器
    kn = KNeighborsClassifier()
    kn.fit(x_train,y_train)   #  開始訓練數據

    y_predict  = kn.predict(x_test)
    print(y_predict)              #  [0 1 1 1 0 0 0 2 2 2 1 2 0 0 1 2 2 2 0 2 1 1 2 1 0 1 1 0 1 2 1 1 0 0 0 1 22]
    print('准確率:',kn.score(x_test,y_test))   #  0.9473684210526315

    return None

 

2:朴素貝葉斯

計算出數據屬於各個目標值的概率,得出最大概率即對應樣本屬於該目標值類別。

注:w為給定文檔的特征值(頻數統計,預測文檔提供),c為文檔類別

from sklearn.datasets import load_iris,fetch_20newsgroups,load_boston
from sklearn.naive_bayes import MultinomialNB

def naive_bayes():
    """
    朴樹貝葉斯算法實現新聞分類
    :return:
    """
    #  獲取數據集
    news = fetch_20newsgroups()
    print(len(news.data))
    # 切割數據集
    x_train,x_test,y_train,y_test = train_test_split(news.data,news.target,test_size=0.25)
    # 特征化出處理
    ss = StandardScaler()
    ss.fit_transform(x_train)
    ss.transform(x_test)
    # 算法實現
    nb = MultinomialNB()
    nb.fit(x_train,y_train)
    y_predict = nb.predict(x_test)
    score = nb.score(x_test,y_test)
    print()

    return None

 

3:決策樹

划分依據:信息增益,信息增益最大的特征值是最有特征

特征A對訓練數據集D的信息增益g(D,A),定義為集合D的信息熵H(D)與特征A給定條件下D的信息條件熵H(D|A)之差。

from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier

def decision_tree():
    """
    決策樹
    :return:
    """
    data = pd.read_csv('./data/taitan.csv')
    # #  對數據處理
    data['age'].fillna(data['age'].mean(),inplace=True)
    # # 切割數據數據集
    feature = data[['age','sex','pclass']]
    target = data['survived']
    x_train,x_test,y_train,y_test = train_test_split(feature,target,test_size=0.25)

    # 對特征值做z字典特征處理》》類別-》one_hot編碼       : 特征中有類別的要做one_hot 編碼
    dv = DictVectorizer(sparse=False)
    x_train = dv.fit_transform(x_train.to_dict(orient="records"))       #one_hot 編碼
    x_test = dv.transform(x_test.to_dict(orient="records"))


    # 決策樹
    dt = DecisionTreeClassifier()
    dt.fit(x_train,y_train)

    y_predict = dt.predict(x_test)
    print(dt.score(x_test,y_test))

 

4:隨機森林

包含了多個決策樹,

學習算法
根據下列算法而建造每棵樹:
•用N來表示訓練用例(樣本)的個數,M表示特征數目。
•輸入特征數目m,用於確定決策樹上一個節點的決策結果;其中m應遠小於M。
•從N個訓練用例(樣本)中以有放回抽樣一個樣本,取樣N次,形成一個訓練集(即bootstrap取樣),並用未抽到的用例(樣本)作預測,評估其誤差。

from sklearn.feature_extraction import DictVectorizer
from sklearn.ensemble import RandomForestClassifier

def decision_tree():
    """
    決策樹
    :return:
    """
    data = pd.read_csv('./data/taitan.csv')
    # #  對數據處理
    data['age'].fillna(data['age'].mean(),inplace=True)
    # # 切割數據數據集
    feature = data[['age','sex','pclass']]
    target = data['survived']
    x_train,x_test,y_train,y_test = train_test_split(feature,target,test_size=0.25)

    # 對特征值做z字典特征處理》》類別-》one_hot編碼       : 特征中有類別的要做one_hot 編碼
    dv = DictVectorizer(sparse=False)
    x_train = dv.fit_transform(x_train.to_dict(orient="records"))       #one_hot 編碼
    x_test = dv.transform(x_test.to_dict(orient="records"))


    # 決策樹
    dt = DecisionTreeClassifier()
    dt.fit(x_train,y_train)

    y_predict = dt.predict(x_test)
    print(dt.score(x_test,y_test))

    # 隨機森林
    rfc = RandomForestClassifier()
    rfc.fit(x_train, y_train)  # 開始訓練數據

    y_predict = rfc.predict(x_test)
    print(y_predict)
    print('隨機森林准確率:', rfc.score(x_test, y_test))

5:邏輯回歸

解決二分類的利器

from sklearn.linear_model import LogisticRegression
def logistic():
    """
    邏輯回歸:預測癌症
    :return:
    """
    #  獲取數據集和整理數據集
    column = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape',
              'Marginal Adhesion', 'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin', 'Normal Nucleoli',
              'Mitoses', 'Class']

    data = pd.read_csv('./data/cancer.csv',names=column)

    #  原數據中有 ? 值 要做替換
    data = data.replace(to_replace='?',value=np.nan)
    data = data.dropna()

    data_train = data[column[1:10]]
    data_target = data[column[10]]

    # 切割數據集
    x_train, x_test, y_train, y_test = train_test_split(data_train, data_target, test_size=0.25)
    # 特征處理
    ss = StandardScaler()
    ss.fit_transform(x_train)
    ss.transform(x_test)
    # 邏輯回歸算法
    lg = LogisticRegression()
    lg.fit(x_train,y_train)
    print(lg.score(x_test,y_test))
    print(lg.coef_)
    cf = classification_report(y_test,lg.predict(x_test), labels=[2, 4], target_names=["良性", "惡性"])
    print(cf)

    return None

 

6:線性回歸和嶺回歸

線性回歸原理:y =  matmul(x,w) + bias  

def linear():
    """
    正規方程和梯度下降預測波士頓房價
    :return: None
    """
    # 獲取波士頓數據集
    lb = load_boston()

    # 切割數據集
    x_train, x_test, y_train, y_test = train_test_split(lb.data,lb.target,test_size=0.25)

    #  特征值和目標值都做 標准化特征處理
    std_x = StandardScaler()
    x_train = std_x.fit_transform(x_train)
    x_test = std_x.transform(x_test)

    std_y = StandardScaler()
    y_train = std_y.fit_transform(y_train.reshape(-1, 1))     #  sklearn 中  必須將一維矩陣轉化為二維
    y_test = std_y.transform(y_test.reshape(-1, 1))

    # 正規方程實現   :
    lr = LinearRegression()
    lr.fit(x_train,y_train)
    print('正規方程',lr.coef_)
    print('正規方程',lr.score(x_test,y_test))
    y_true = std_y.inverse_transform(y_test)
    y_pre = std_y.inverse_transform(lr.predict(x_test))
    ms = mean_squared_error(y_true,y_pre)
    print('正規方程均方差評價:',ms)

    # 梯度下降
    sgd = SGDRegressor()
    sgd.fit(x_train,y_train)
    print('梯度下降',sgd.coef_)
    print('梯度下降',sgd.score(x_test,y_test))
    y_true = std_y.inverse_transform(y_test)
    y_pre1 = std_y.inverse_transform(sgd.predict(x_test))
    ms1 = mean_squared_error(y_true,y_pre1)
    print('梯度下降均方差評價:',ms1)

    # 嶺回歸
    rd = Ridge()
    rd.fit(x_train,y_train)
    print('嶺回歸',rd.coef_)
    print('嶺回歸',rd.score(x_test,y_test))
    y_true = std_y.inverse_transform(y_test)
    y_pre_r = std_y.inverse_transform(rd.predict(x_test))
    ms1 = mean_squared_error(y_true,y_pre_r)
    print('嶺回歸均方差評價:',ms1)
    
    return None

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM