在處理完數據之后,選擇好模型,就可以用訓練集訓練模型,用測試集輸入模型 然后輸出需要預測的結果啦~
一、模塊導入
import numpy as np
import pandas as pd #讀入數據
二、pandas數據
一、dataframe基礎
一、dataframe的創建
- 通過字典來創建DataFrame
字典的鍵值表示列號,value用列表格式,表示該列的行數據。
外層key做列索引,內層key做行索引
persons = {'name': ['小睿', '小麗', '小明', '小紅'],'age': [19, 18, 18, 17],'sex': ['男', '男', '女', '男'], } # 字典的key作為列索引 data_frame1 =pd.DataFrame(persons)
二、從csv中讀入
pd.read_csv()有很多參數
raw_data=pd.read_csv(path,names=names,header=None,delim_whitespace=True)
path指定文件路徑,names指定列名,header指明csv文件中是否有列名,delim_whitespace、sep可以用來將同一列的數據分割成多列,usecols?可以選擇數據中的列放入dataframe
names=['CRIM','ZN','INDUS','CHAS','NOX','RM','AGE','DIS',
'RAD','TAX','PRTATIO','B','LSTAT','MEDV']
path='E:\Python項目程序\人工智能企業實訓\housing.csv'
raw_data=pd.read_csv(path,names=names,header=None,delim_whitespace=True)
print(raw_df.head(3))#head用于讀取多少行print(raw_df.describe())#按一列的來算
print(raw_df.info())#查看數據類型,如果有obj需要編碼,最好用32類型的;也可以看是否存在空值
三、數據探索
我們可以查看數據是否有空值,數據的均值方差等來查看數據的特征,如果數據存在空值,我們可能需要進行缺失值處理。查看數據特征和異常值還可以通過畫圖來觀察到。
使用dataframe的數據基本信息
方法:
- head()
- describe()
- info()
由于數據集在同一列中,并且沒有列名,因此我們需要使用sep將一列中的多個數據拆開,由于沒有列名,需要使用header=None:
import pandas as pd
names=['CRIM','ZN','INDUS','CHAS','NOX','RM','AGE','DIS','RAD','TAX','PRTATIO','B','LSTAT','MEDV']
df=pd.read_csv('./dataset.csv',names=names,header=None,delim_whitespace=True)#默認是當前路徑下的文件,如果沒有names=names,則列名默認從0開始編號
print(df.head())
注意:接下來的df全是這里用pd.read_csv()得到的。
一、head方法(查看前n行)
- 輸出dataframe中的前n行,標識出列名和行號
print(df.head())#默認輸出數據前五行
print(df.head(10))#輸出數據前10行
二、describe方法(查看列的數學統計)
- 輸出dataframe中每一列的數學統計值。
print(df.describe())
它將打印每一列特征的個數,平均數,方差,最小值,最大值,以及箱型圖中的25%、50%、75%。
三、info方法(查看空值和數據類型)
- 輸出每一列是否存在空值,以及類型
print(df.info())
None被認為是空值
四、isnull方法(轉換數據為是否為空)
- 對每一個數據判斷是否為空,不為空值為False(和notnull()方法相反)
- 搭配sum()方法可以直接找到空值個數
- df.isnull().sum()?每一列空值個數
- df.isnull().sum().sum()數據中存在空值的個數
print(df.isnull())
print(df.isnull().sum())
sum()方法類似于數據庫中的聚集函數,對每一列求總和,輸出出來,返回的是一個Series類型。還可以再使用一次sum(),求出series中元素的總和。
print(df.isnull().sum().sum())
五、查看是否有空值
path='./data.csv'
df=pd.read_csv(path)print(df.isnull().sum())#輸入每一列的空值個數
print(df.isnull().sum().sum())#輸入總共的空值個數
四、數據預處理
我們要將需要預測的數據,和訓練數據合并之后再進行一起處理,因為輸入模型的數據格式要相同。之前在查看空值時,也應該合并。
train_data = pd.read_csv( "./data./train.csv")
test_data = pd.read_csv( "./data./test.csv")
# 合并train, test
data = pd.concat([train_data, test_data], axis=0)#因為要對列進行統一處理
'''axis=0是指在y軸上合并,即按行合并'''
一、缺失值處理
缺失值處理有很多種方式,這里只寫兩個。將這些方法當做類調用即可,不需要關注實現。調用之后直接使用被填充后的數據。
①IterativeImputer多變量缺失值填補
#df是df=pd.read_csv(path),從csv中讀取到的文件,Dataframe格式 from sklearn.experimental import enable_iterative_imputer from sklearn.impute import IterativeImputerimp_mean = IterativeImputer(random_state=0)#random_state是隨機種子 imp_mean.fit(df) filled_data =imp_mean.transform(df) '''filled_data和df的區別就是 filled_data是數據已經被填充了的,并且filled_data不是Dataframe類型'''save_df=pd.DataFrame(filled_data)#保存填充后的文件 csv_path='./IterativeImputer.csv' save_df.to_csv(csv_path,index=False)
②KNNImputer?K近鄰缺失值填補
該方法是借助?包含缺失值數據附近的 其他特征和它最像的 n_neighbors個數據的 該特征值的平均值來填補缺失值的。
from sklearn.impute import KNNImputerimputer=KNNImputer(n_neighbors=2) df=pd.Dataframe(imputer.fit_transform(df))
解釋:
'''使用具有缺失值的樣本的兩個最近鄰居的平均特征值替換編碼為np.nan的缺失值:''' from sklearn.impute import KNNImputer data = [[2, 4, 8], [3, np.nan, 7], [5, 8, 3], [4, 3, 8]] imputer = KNNImputer(n_neighbors=1) imputer.fit_transform(data) '''可以看到,因為第二個樣本的第一列特征3和第三列特征7,與第一行樣本的第一列特征2和第三列特征8的歐氏距離最近,所以缺失值按照第一個樣本來填充,填充值為4。那么n_neighbors=2呢?''' imputer = KNNImputer(n_neighbors=2) imputer.fit_transform(data) '''此時根據歐氏距離算出最近相鄰的是第一行樣本與第四行樣本,此時的填充值就是這兩個樣本第二列特征4和3的均值:3.5。'''
二、數據標準化
一、最大最小值縮放
from sklearn.preprocessing import MinMaxScaler
scaler=MinMaxScaler(feature_range=(0,1))
X1=scaler.fit_transform(df)
二、正態化數據
from sklearn.preprocessing import StandardScaler
scaler=StandardScaler().fit(df)
X1=scaler.transform(df)
三、標準化數據(歸一化)
Normalize Data 處理是將每一行數據的距離處理成1的數據,又叫歸一化 適合處理稀疏數據(有很多0), 歸一處理的數據對使用權重輸入的神經網絡和使用距離的K近鄰準確度有顯著提升
from sklearn.preprocessing import Normalizer
scaler=Normalizer().fit(df)
X1=transformer.transform(df)
三、數據編碼、異常值處理
部分處理方式。日期需要特殊處理,對于一些值也可能需要進行數據清洗。
一、one-hot編碼
data=data[['Survived','Pclass','Sex','Age','Fare','Embarked','Title','TicketGroup']]
#上面
data=pd.get_dummies(data)#ont-hot編碼
?二、標簽編碼
from sklearn.preprocessing import LabelEncoder
cat_columns = data.select_dtypes(include='O').columns
for col in cat_columns:le = LabelEncoder()data[col] = le.fit_transform(data[col])
'''對非數值特征進行標簽編碼,即非數值編碼成0,1,2,3,4'''
'''A,B,C變成0,1,2這種'''
'''one-hot編碼需要大量存儲空間'''
data.drop(['id'], axis=1, inplace=True)
train = data[data['label'].notnull()]
test = data[data['label'].isnull()].drop(['label'], axis=1)
五、特征選擇
PCA主成分分析法、遞歸特征消除RFE、多維標度法MDS等等。
一、隨機森林重要性得分(有很多種方式)
from sklearn.ensemble import ExtraTreesClassifier
model=ExtraTreesClassifier()
fit=model.fit(X,y) #X是從train中抽出的特征,y是標簽
print(fit.feature_importances_)
二、遞歸特征消除RFE
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
model=LogisticRegression()
rfe=RFE(model,3)
fit=rfe.fit(X,y)
print('被選定的特征',fit.support_)
print('特征排名:',fit.ranking_)
六、劃分訓練測試集
正確做法:先劃分數據集,再分別進行同樣的特征選擇,防止數據泄露。
????????因為測試集對于模型來說應該是“看不見”的,而對于計算特征得分,或者主成分分析,遞歸下降法等特征選擇算法都需要對整個數據集進行考慮,因此為了使得測試集對于模型而言是完全未知的,就需要我們先將訓練集和測試集分離之后,再分別用同樣的方式進行特征選擇。
? ? ? ? 注意這樣即使是使用降維的特征選擇也是不會有問題的。因為我們在劃分出測試集時,是進行隨機抽取的,換句話說,由于隨機性,測試集也具有數據的代表性。
from sklearn.model_selection import train_test_split'''-----------------選出特征和標簽------------------------''' #X選擇特征列(一般不包含id號), Y選擇標簽列 X=raw_data.iloc[:,0:13]#dataframe 可以用iloc[行范圍,列范圍]選擇特征列 Y=raw_data.iloc[:,13]#選擇標簽列'''----------劃分訓練集和測試集(如果沒有可以測試模型得分的測試集時)------------''' x_train,x_test,y_train,y_test=train_test_split(X,Y,test_size=0.1,random_state=11) #按照test:train=0.1進行隨機劃分訓練集和測試集 ,這里隨機種子=11 #x_train -- y_train ; x_test -- y_test #將訓練集進一步劃分成訓練集和驗證集 x_train,x_val,y_train,y_val=train_test_split(x_train,y_train,test_size=0.1,random_state=11)#x_train 和 y_train作為輸入用來進行模型訓練。
七、繪圖常用模塊
import matplotlib.pyplot as plt
import seaborn as sns