<一>:特征工程:將原始數據轉化為算法數據
一:特征值抽取
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