Python機(jī)器學(xué)習(xí)01 - Sklearn


機(jī)器學(xué)習(xí)獲取數(shù)據(jù)集,訓(xùn)練模型,預(yù)測模型,評估模型 示例代碼
from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score, classification_report, confusion_matrix import pandas as pd # 加載Iris數(shù)據(jù)集 iris = load_iris() # 查看數(shù)據(jù)集的基本信息 print("數(shù)據(jù)集特征名稱:") print(iris.feature_names) print("\n數(shù)據(jù)集目標(biāo)名稱:") print(iris.target_names) print("\n數(shù)據(jù)集形狀:") print(iris.data.shape) print("\n目標(biāo)值形狀:") print(iris.target.shape) # 將數(shù)據(jù)轉(zhuǎn)換為DataFrame格式以便更好地查看 iris_df = pd.DataFrame(data=iris.data, columns=iris.feature_names) iris_df['target'] = iris.target # 顯示前5行數(shù)據(jù) print("\n數(shù)據(jù)集前5行:") print(iris_df.head()) # 顯示數(shù)據(jù)集的基本統(tǒng)計信息 print("\n數(shù)據(jù)集統(tǒng)計信息:") print(iris_df.describe()) # 顯示各類別樣本數(shù)量 print("\n各類別樣本數(shù)量:") target_counts = iris_df['target'].value_counts().sort_index() for i, count in enumerate(target_counts): print(f"{iris.target_names[i]}: {count} 個樣本") # 顯示數(shù)據(jù)集的一些額外信息 print("\n數(shù)據(jù)集描述:") print(iris.DESCR[:500] + "...") # ==================== 新增:數(shù)據(jù)集分類示例 ==================== print("\n" + "=" * 50) print("數(shù)據(jù)集分類示例") print("=" * 50) # 1. 分割數(shù)據(jù)集為訓(xùn)練集和測試集 X_train, X_test, y_train, y_test = train_test_split( iris.data, iris.target, test_size=0.3, random_state=42, stratify=iris.target ) print(f"訓(xùn)練集大小: {X_train.shape[0]}") print(f"測試集大小: {X_test.shape[0]}") # 2. 創(chuàng)建KNN分類器 knn_classifier = KNeighborsClassifier(n_neighbors=3) # 3. 訓(xùn)練模型 knn_classifier.fit(X_train, y_train) # 4. 進(jìn)行預(yù)測 y_pred = knn_classifier.predict(X_test) # 5. 評估模型性能 accuracy = accuracy_score(y_test, y_pred) print(f"\n模型準(zhǔn)確率: {accuracy:.4f}") # 6. 詳細(xì)的分類報告 print("\n分類報告:") print(classification_report(y_test, y_pred, target_names=iris.target_names)) # 7. 混淆矩陣 print("\n混淆矩陣:") print(confusion_matrix(y_test, y_pred)) # 8. 預(yù)測新樣本示例 print("\n新樣本預(yù)測示例:") # 創(chuàng)建一個新樣本(花瓣和花萼的測量值) new_sample = [[5.1, 3.5, 1.4, 0.2]] prediction = knn_classifier.predict(new_sample) predicted_class = iris.target_names[prediction[0]] print(f"新樣本 {new_sample[0]} 預(yù)測類別: {predicted_class}")
機(jī)器學(xué)習(xí)基礎(chǔ)知識示例代碼
from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.feature_extraction import DictVectorizer from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer from sklearn.preprocessing import MinMaxScaler, StandardScaler from sklearn.feature_selection import VarianceThreshold from sklearn.decomposition import PCA from scipy.stats import pearsonr import jieba import pandas as pd def datasets_demo(): """ sklearn數(shù)據(jù)集使用 :return: """ # 獲取數(shù)據(jù)集 iris = load_iris() print("鳶尾花數(shù)據(jù)集:\n", iris) print("查看數(shù)據(jù)集描述:\n", iris["DESCR"]) print("查看特征值的名字:\n", iris.feature_names) print("查看特征值:\n", iris.data, iris.data.shape) # 數(shù)據(jù)集劃分 x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22) print("訓(xùn)練集的特征值:\n", x_train, x_train.shape) return None def dict_demo(): """ 字典特征抽取 :return: """ data = [{'city': '北京','temperature':100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature':30}] # 1、實(shí)例化一個轉(zhuǎn)換器類 transfer = DictVectorizer(sparse=True) # 2、調(diào)用fit_transform() data_new = transfer.fit_transform(data) print("data_new:\n", data_new.toarray(), type(data_new)) print("特征名字:\n", transfer.get_feature_names()) return None def count_demo(): """ 文本特征抽取:CountVecotrizer :return: """ data = ["life is short,i like like python", "life is too long,i dislike python"] # 1、實(shí)例化一個轉(zhuǎn)換器類 transfer = CountVectorizer(stop_words=["is", "too"]) # 2、調(diào)用fit_transform data_new = transfer.fit_transform(data) print("data_new:\n", data_new.toarray()) print("特征名字:\n", transfer.get_feature_names()) return None def count_chinese_demo(): """ 中文文本特征抽取:CountVecotrizer :return: """ data = ["我 愛 北京 天安門", "天安門 上 太陽 升"] # 1、實(shí)例化一個轉(zhuǎn)換器類 transfer = CountVectorizer() # 2、調(diào)用fit_transform data_new = transfer.fit_transform(data) print("data_new:\n", data_new.toarray()) print("特征名字:\n", transfer.get_feature_names()) return None def cut_word(text): """ 進(jìn)行中文分詞:"我愛北京天安門" --> "我 愛 北京 天安門" :param text: :return: """ return " ".join(list(jieba.cut(text))) def count_chinese_demo2(): """ 中文文本特征抽取,自動分詞 :return: """ # 將中文文本進(jìn)行分詞 data = ["一種還是一種今天很殘酷,明天更殘酷,后天很美好,但絕對大部分是死在明天晚上,所以每個人不要放棄今天。", "我們看到的從很遠(yuǎn)星系來的光是在幾百萬年之前發(fā)出的,這樣當(dāng)我們看到宇宙時,我們是在看它的過去。", "如果只用一種方式了解某樣事物,你就不會真正了解它。了解事物真正含義的秘密取決于如何將其與我們所了解的事物相聯(lián)系。"] data_new = [] for sent in data: data_new.append(cut_word(sent)) # print(data_new) # 1、實(shí)例化一個轉(zhuǎn)換器類 transfer = CountVectorizer(stop_words=["一種", "所以"]) # 2、調(diào)用fit_transform data_final = transfer.fit_transform(data_new) print("data_new:\n", data_final.toarray()) print("特征名字:\n", transfer.get_feature_names()) return None def tfidf_demo(): """ 用TF-IDF的方法進(jìn)行文本特征抽取 :return: """ # 將中文文本進(jìn)行分詞 data = ["一種還是一種今天很殘酷,明天更殘酷,后天很美好,但絕對大部分是死在明天晚上,所以每個人不要放棄今天。", "我們看到的從很遠(yuǎn)星系來的光是在幾百萬年之前發(fā)出的,這樣當(dāng)我們看到宇宙時,我們是在看它的過去。", "如果只用一種方式了解某樣事物,你就不會真正了解它。了解事物真正含義的秘密取決于如何將其與我們所了解的事物相聯(lián)系。"] data_new = [] for sent in data: data_new.append(cut_word(sent)) # print(data_new) # 1、實(shí)例化一個轉(zhuǎn)換器類 transfer = TfidfVectorizer(stop_words=["一種", "所以"]) # 2、調(diào)用fit_transform data_final = transfer.fit_transform(data_new) print("data_new:\n", data_final.toarray()) print("特征名字:\n", transfer.get_feature_names()) return None def minmax_demo(): """ 歸一化 :return: """ # 1、獲取數(shù)據(jù) data = pd.read_csv("dating.txt") data = data.iloc[:, :3] print("data:\n", data) # 2、實(shí)例化一個轉(zhuǎn)換器類 transfer = MinMaxScaler(feature_range=[2, 3]) # 3、調(diào)用fit_transform data_new = transfer.fit_transform(data) print("data_new:\n", data_new) return None def stand_demo(): """ 標(biāo)準(zhǔn)化 :return: """ # 1、獲取數(shù)據(jù) data = pd.read_csv("dating.txt") data = data.iloc[:, :3] print("data:\n", data) # 2、實(shí)例化一個轉(zhuǎn)換器類 transfer = StandardScaler() # 3、調(diào)用fit_transform data_new = transfer.fit_transform(data) print("data_new:\n", data_new) return None def variance_demo(): """ 過濾低方差特征 :return: """ # 1、獲取數(shù)據(jù) data = pd.read_csv("factor_returns.csv") data = data.iloc[:, 1:-2] print("data:\n", data) # 2、實(shí)例化一個轉(zhuǎn)換器類 transfer = VarianceThreshold(threshold=10) # 3、調(diào)用fit_transform data_new = transfer.fit_transform(data) print("data_new:\n", data_new, data_new.shape) # 計算某兩個變量之間的相關(guān)系數(shù) r1 = pearsonr(data["pe_ratio"], data["pb_ratio"]) print("相關(guān)系數(shù):\n", r1) r2 = pearsonr(data['revenue'], data['total_expense']) print("revenue與total_expense之間的相關(guān)性:\n", r2) return None def pca_demo(): """ PCA降維 :return: """ data = [[2,8,4,5], [6,3,0,8], [5,4,9,1]] # 1、實(shí)例化一個轉(zhuǎn)換器類 transfer = PCA(n_components=0.95) # 2、調(diào)用fit_transform data_new = transfer.fit_transform(data) print("data_new:\n", data_new) return None if __name__ == "__main__": # 代碼1:sklearn數(shù)據(jù)集使用 # datasets_demo() # 代碼2:字典特征抽取 # dict_demo() # 代碼3:文本特征抽取:CountVecotrizer # count_demo() # 代碼4:中文文本特征抽取:CountVecotrizer # count_chinese_demo() # 代碼5:中文文本特征抽取,自動分詞 # count_chinese_demo2() # 代碼6:中文分詞 # print(cut_word("我愛北京天安門")) # 代碼7:用TF-IDF的方法進(jìn)行文本特征抽取 # tfidf_demo() # 代碼8:歸一化 # minmax_demo() # 代碼9:標(biāo)準(zhǔn)化 # stand_demo() # 代碼10:低方差特征過濾 # variance_demo() # 代碼11:PCA降維 pca_demo()
機(jī)器學(xué)習(xí)視頻紀(jì)要
人工智能階段 機(jī)器學(xué)習(xí) 三天 深度學(xué)習(xí) 三天 量化交易 四天 傳統(tǒng)的機(jī)器學(xué)習(xí)算法 機(jī)器學(xué)習(xí)概述、特征工程 1天 分類算法 1天 回歸算法、聚類 1天 機(jī)器學(xué)習(xí)概述 1.1 人工智能概述 機(jī)器學(xué)習(xí)是人工智能的一個實(shí)現(xiàn)途徑 深度學(xué)習(xí)是機(jī)器學(xué)習(xí)的一個方法發(fā)展而來 1.1.2 機(jī)器學(xué)習(xí)、深度學(xué)習(xí)能做些什么 傳統(tǒng)預(yù)測 圖像識別 自然語言處理 1.2 什么是機(jī)器學(xué)習(xí) 數(shù)據(jù) 模型 預(yù)測 從歷史數(shù)據(jù)當(dāng)中獲得規(guī)律?這些歷史數(shù)據(jù)是怎么的格式? 1.2.3 數(shù)據(jù)集構(gòu)成 特征值 + 目標(biāo)值 1.3 機(jī)器學(xué)習(xí)算法分類 監(jiān)督學(xué)習(xí) 目標(biāo)值:類別 - 分類問題 k-近鄰算法、貝葉斯分類、決策樹與隨機(jī)森林、邏輯回歸 目標(biāo)值:連續(xù)型的數(shù)據(jù) - 回歸問題 線性回歸、嶺回歸 目標(biāo)值:無 - 無監(jiān)督學(xué)習(xí) 聚類 k-means 1、預(yù)測明天的氣溫是多少度? 回歸 2、預(yù)測明天是陰、晴還是雨? 分類 3、人臉年齡預(yù)測? 回歸/分類 4、人臉識別? 分類 1.4 機(jī)器學(xué)習(xí)開發(fā)流程 1)獲取數(shù)據(jù) 2)數(shù)據(jù)處理 3)特征工程 4)機(jī)器學(xué)習(xí)算法訓(xùn)練 - 模型 5)模型評估 6)應(yīng)用 1.5 學(xué)習(xí)框架和資料介紹 1)算法是核心,數(shù)據(jù)與計算是基礎(chǔ) 2)找準(zhǔn)定位 3)怎么做? 1、入門 2、實(shí)戰(zhàn)類書籍 3、機(jī)器學(xué)習(xí) -”西瓜書”- 周志華 統(tǒng)計學(xué)習(xí)方法 - 李航 深度學(xué)習(xí) - “花書” 4)1.5.1 機(jī)器學(xué)習(xí)庫與框架 特征工程 2.1 數(shù)據(jù)集 2.1.1 可用數(shù)據(jù)集 公司內(nèi)部 百度 數(shù)據(jù)接口 花錢 數(shù)據(jù)集 學(xué)習(xí)階段可以用的數(shù)據(jù)集: 1)sklearn 2)kaggle 3)UCI 1 Scikit-learn工具介紹 2.1.2 sklearn數(shù)據(jù)集 sklearn.datasets load_* 獲取小規(guī)模數(shù)據(jù)集 fetch_* 獲取大規(guī)模數(shù)據(jù)集 2 sklearn小數(shù)據(jù)集 sklearn.datasets.load_iris() 3 sklearn大數(shù)據(jù)集 sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’) 4 數(shù)據(jù)集的返回值 datasets.base.Bunch(繼承自字典) dict["key"] = values bunch.key = values 思考:拿到的數(shù)據(jù)是否全部都用來訓(xùn)練一個模型? 2.1.3 數(shù)據(jù)集的劃分 訓(xùn)練數(shù)據(jù):用于訓(xùn)練,構(gòu)建模型 測試數(shù)據(jù):在模型檢驗(yàn)時使用,用于評估模型是否有效 測試集 20%~30% sklearn.model_selection.train_test_split(arrays, *options) 訓(xùn)練集特征值,測試集特征值,訓(xùn)練集目標(biāo)值,測試集目標(biāo)值 x_train, x_test, y_train, y_test 2.2 特征工程介紹 算法 特征工程 2.2.1 為什么需要特征工程(Feature Engineering) 2.2.2 什么是特征工程 sklearn 特征工程 pandas 數(shù)據(jù)清洗、數(shù)據(jù)處理 特征抽取/特征提取 機(jī)器學(xué)習(xí)算法 - 統(tǒng)計方法 - 數(shù)學(xué)公式 文本類型 -》 數(shù)值 類型 -》 數(shù)值 2.3.1 特征提取 sklearn.feature_extraction 2.3.2 字典特征提取 - 類別 -> one-hot編碼 sklearn.feature_extraction.DictVectorizer(sparse=True,…) vector 數(shù)學(xué):向量 物理:矢量 矩陣 matrix 二維數(shù)組 向量 vector 一維數(shù)組 父類:轉(zhuǎn)換器類 返回sparse矩陣 sparse稀疏 將非零值 按位置表示出來 節(jié)省內(nèi)存 - 提高加載效率 應(yīng)用場景: 1)pclass, sex 數(shù)據(jù)集當(dāng)中類別特征比較多 1、將數(shù)據(jù)集的特征-》字典類型 2、DictVectorizer轉(zhuǎn)換 2)本身拿到的數(shù)據(jù)就是字典類型 2.3.3 文本特征提取 單詞 作為 特征 句子、短語、單詞、字母 特征:特征詞 方法1:CountVectorizer 統(tǒng)計每個樣本特征詞出現(xiàn)的個數(shù) stop_words停用的 停用詞表 關(guān)鍵詞:在某一個類別的文章中,出現(xiàn)的次數(shù)很多,但是在其他類別的文章當(dāng)中出現(xiàn)很少 方法2:TfidfVectorizer TF-IDF - 重要程度 兩個詞 “經(jīng)濟(jì)”,“非常” 1000篇文章-語料庫 100篇文章 - "非常" 10篇文章 - “經(jīng)濟(jì)” 兩篇文章 文章A(100詞) : 10次“經(jīng)濟(jì)” TF-IDF:0.2 tf:10/100 = 0.1 idf:lg 1000/10 = 2 文章B(100詞) : 10次“非常” TF-IDF:0.1 tf:10/100 = 0.1 idf: log 10 1000/100 = 1 對數(shù)? 2 ^ 3 = 8 log 2 8 = 3 log 10 10 = 1 TF - 詞頻(term frequency,tf) IDF - 逆向文檔頻率 特征預(yù)處理 2.4.1 什么是特征預(yù)處理 為什么我們要進(jìn)行歸一化/標(biāo)準(zhǔn)化? 無量綱化 2.4.2 歸一化 異常值:最大值、最小值 2.4.3 標(biāo)準(zhǔn)化 (x - mean) / std 標(biāo)準(zhǔn)差:集中程度 應(yīng)用場景: 在已有樣本足夠多的情況下比較穩(wěn)定,適合現(xiàn)代嘈雜大數(shù)據(jù)場景。 特征降維 2.5.1 降維 - 降低維度 ndarray 維數(shù):嵌套的層數(shù) 0維 標(biāo)量 1維 向量 2維 矩陣 二維數(shù)組 此處的降維: 降低特征的個數(shù) 效果: 特征與特征之間不相關(guān) 2.5.1 降維 特征選擇 Filter過濾式 方差選擇法:低方差特征過濾 相關(guān)系數(shù) - 特征與特征之間的相關(guān)程度 取值范圍:–1≤ r ≤+1 皮爾遜相關(guān)系數(shù) 0.9942 特征與特征之間相關(guān)性很高: 1)選取其中一個 2)加權(quán)求和 3)主成分分析 Embeded嵌入式 決策樹 第二天 正則化 第三天 深度學(xué)習(xí) 第五天 主成分分析 2.6.1 什么是主成分分析(PCA) sklearn.decomposition.PCA(n_components=None) n_components 小數(shù) 表示保留百分之多少的信息 整數(shù) 減少到多少特征 2.6.2 案例:探究用戶對物品類別的喜好細(xì)分 用戶 物品類別 user_id aisle 1)需要將user_id和aisle放在同一個表中 - 合并 2)找到user_id和aisle - 交叉表和透視表 3)特征冗余過多 -> PCA降維

浙公網(wǎng)安備 33010602011771號