100-Days-Of-ML oneday

這個博客是基於github上項目,Avik Jain致力於通過這個項目,讓機器學習入門者學習機器學習的理論與實戰,話不多說,現在開始:
https://github.com/Avik-Jain/100-Days-Of-ML-Code
在這裏插入圖片描述
注意:
1、pandas包生成的DF使用切片方式不同於python中的切片([:],包左不包右),DF.loc[0:3] 一共是四行
2、pandas中的df.concat()方法參數axis=0 和 axis=1,相當於sql中的union和join,他和fd.merge的區別
https://codeday.me/bug/20180824/225799.html
https://www.jb51.net/article/134615.htm pandas函數
pd.merge(df1, df2, on=‘col1’,
how=‘inner’,sort=True) 合併兩個DataFrame,按照共有的某列做內連接(交集),outter爲外連接(並集),結果排序
pd.merge(df1, df2, left_on=‘col1’,
right_on=‘col2’) df1 df2沒有公共列名,所以合併需指定兩邊的參考列
pd.concat([sr1, sr2, sr3,…], axis=0) 多個Series堆疊成多行,結果仍然是一個Series
pd.concat([sr1, sr2, sr3,…], axis=1) 多個Series組合成多行多列,結果是一個DataFrame,索引取並集,沒有交集的位置填入缺省值NaN
3、
一、導包
import nu

二、
準備數據:
Country,Age,Salary,Purchased
France,44,72000,No
Spain,27,48000,Yes
Germany,30,54000,No
Spain,38,61000,No
Germany,40,Yes
France,35,58000,Yes
Spain,52000,No
France,48,79000,Yes
Germany,50,83000,No
France,37,67000,Yes

Jupyter Notebook
ML100Day_1
最後檢查: 8 分鐘前
(自動保存)
Current Kernel Logo
Python 3
File
Edit
View
Insert
Cell
Kernel
Widgets
Help
實際代碼:
import numpy as np
import pandas as pd
df = pd.read_csv(‘C:\Users\Administrator\Desktop\ml 100day\MLDayOneData.csv’)
print(df)
Country Age Salary Purchased
0 France 44.0 72000.0 No
1 Spain 27.0 48000.0 Yes
2 Germany 30.0 54000.0 No
3 Spain 38.0 61000.0 No
4 Germany 40.0 NaN Yes
5 France 35.0 58000.0 Yes
6 Spain NaN 52000.0 No
7 France 48.0 79000.0 Yes
8 Germany 50.0 83000.0 No
9 France 37.0 67000.0 Yes
#從qdf中取出x和y,並將他們轉換成ndarray
x = df.iloc[ : ,:-1].values
print(type(df.iloc[ : ,3]))
print(type(x))
y = df.iloc[:,3].values
<class ‘pandas.core.series.Series’>
<class ‘numpy.ndarray’>
#處理空值
#首先創建異常值處理器對象
from sklearn.preprocessing import Imputer
imp = Imputer(missing_values = “NaN”,strategy = “mean”,axis = 0)
print(x)
[[‘France’ 44.0 72000.0]
[‘Spain’ 27.0 48000.0]
[‘Germany’ 30.0 54000.0]
[‘Spain’ 38.0 61000.0]
[‘Germany’ 40.0 nan]
[‘France’ 35.0 58000.0]
[‘Spain’ nan 52000.0]
[‘France’ 48.0 79000.0]
[‘Germany’ 50.0 83000.0]
[‘France’ 37.0 67000.0]]
C:\Users\Administrator\AppData\Roaming\Python\Python37\site-packages\sklearn\utils\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.
warnings.warn(msg, category=DeprecationWarning)
#將有異常值的列進行處理(所有行,所有特徵x)
imp = imp.fit(x[ : ,1:3])
print(imp)
print(type(imp))
Imputer(axis=0, copy=True, missing_values=‘NaN’, strategy=‘mean’, verbose=0)
<class ‘sklearn.preprocessing.imputation.Imputer’>
x[ : , 1:3] = imp.transform(x[ : ,1:3])
print(x)
[[‘France’ 44.0 72000.0]
[‘Spain’ 27.0 48000.0]
[‘Germany’ 30.0 54000.0]
[‘Spain’ 38.0 61000.0]
[‘Germany’ 40.0 63777.77777777778]
[‘France’ 35.0 58000.0]
[‘Spain’ 38.77777777777778 52000.0]
[‘France’ 48.0 79000.0]
[‘Germany’ 50.0 83000.0]
[‘France’ 37.0 67000.0]]
#比如處理y值,y值可能是好壞,矩陣中需要數值型,我們通過encode categorical data,將y轉換成y值
from sklearn.preprocessing import LabelEncoder,OneHotEncoder
#創建標籤編碼器對象
le_x = LabelEncoder()
print(x[ : , 0])

[‘France’ ‘Spain’ ‘Germany’ ‘Spain’ ‘Germany’ ‘France’ ‘Spain’ ‘France’
‘Germany’ ‘France’]
x[ : , 0] = le_x.fit_transform(x[ : , 0])
#fit_transform是fit和transform的簡寫,fit的作用簡單來說,就是求得訓練集X的均值,方差,最大值,最小值,這些訓練集X固有的屬性
#transform的簡寫是利用這些fit出來的結果進行轉換
print(x[ : , 0])

[0 2 1 2 1 0 2 0 1 0]
print(x)
[[0 44.0 72000.0]
[2 27.0 48000.0]
[1 30.0 54000.0]
[2 38.0 61000.0]
[1 40.0 63777.77777777778]
[0 35.0 58000.0]
[2 38.77777777777778 52000.0]
[0 48.0 79000.0]
[1 50.0 83000.0]
[0 37.0 67000.0]]
#現在將變量轉成了數字類型,現在就要使用虛擬變量啞變量(Dummy variable)將數據歸一化,

https://www.cnblogs.com/king-lps/p/7846414.html

拿到獲取的原始特徵,必須對每一特徵分別進行歸一化,比如,特徵A的取值範圍是[-1000,1000],特徵B的取值範圍是[-1,1].如果使用logistic迴歸,w1x1+w2x2,因爲x1的取值太大了,所以x2基本起不了作用。所以,必須進行特徵的歸一化,每個特徵都單獨進行歸一化。

對於連續性特徵:

Rescale bounded continuous features: All continuous input that are bounded, rescale them to [-1, 1] through x = (2x - max - min)/(max - min). 線性放縮到[-1,1]

Standardize all continuous features: All continuous input should be standardized and by this I mean, for every continuous feature, compute its mean (u) and standard deviation (s) and do x = (x - u)/s. 放縮到均值爲0,方差爲1

對於離散性特徵:

Binarize categorical/discrete features: 對於離散的特徵基本就是按照one-hot(獨熱)編碼,該離散特徵有多少取值,就用多少維來表示該特徵。


##獨熱變量的優缺點:優點:one-hot變量解決了分類器不好處理屬性數據的問題,她在一定程度上起到了 擴充特徵 的作用,他的值只有0和1,不同類型存儲在垂直的空間
#缺點:當類別很多時,特徵空間會變得特別大,這種情況下,一般可以用 PCA 來減少維度。而且 one-hot encoding+PCA 這種組合在實際中也非常有用

#什麼情況下用(不用)獨熱編碼?
#用 獨熱編碼用來解決類別型數據的離散值問題
#不用: 將離散型特徵進行one-hot編碼的作用,是爲了讓距離計算更合理,但如果特徵是離散的,並且不用one-hot編碼就可以很合理的計算出距離,那麼就沒必要進行one-hot編碼。 有些基於樹的算法在處理變量時,並不是基於向量空間度量,數值只是個類別符號,即沒有偏序關係,所以不用進行獨熱編碼。 Tree Model不太需要one-hot編碼: 對於決策樹來說,one-hot的本質是增加樹的深度。

什麼情況下(不)需要歸一化? 需要:基於參數模型或者基於距離的模型,都是需要進行特徵的歸一化

不需要:基於樹的方法是不許用進行特徵的歸一化的,例如隨機森林、bagging、BOOSTING等

#啞變量與One-hot編碼的區別在於:啞變量將定性特徵轉化爲n-1個特徵,而One-hot則是轉化爲n個特徵。意思就是啞變量在編碼時會去除第一個狀態,而One-hot則對所有的狀態都會進行編碼。
#創建獨熱編碼器對象
oneHotEncode= OneHotEncoder(categorical_features = [0])
print(oneHotEncode)
OneHotEncoder(categorical_features=[0], categories=None,
dtype=<class ‘numpy.float64’>, handle_unknown=‘error’,
n_values=None, sparse=True)
x = oneHotEncode.fit_transform(x).toarray()

print(type(x))
<class ‘numpy.ndarray’>
x
array([[1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 4.40000000e+01,
7.20000000e+04],
[0.00000000e+00, 0.00000000e+00, 1.00000000e+00, 2.70000000e+01,
4.80000000e+04],
[0.00000000e+00, 1.00000000e+00, 0.00000000e+00, 3.00000000e+01,
5.40000000e+04],
[0.00000000e+00, 0.00000000e+00, 1.00000000e+00, 3.80000000e+01,
6.10000000e+04],
[0.00000000e+00, 1.00000000e+00, 0.00000000e+00, 4.00000000e+01,
6.37777778e+04],
[1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 3.50000000e+01,
5.80000000e+04],
[0.00000000e+00, 0.00000000e+00, 1.00000000e+00, 3.87777778e+01,
5.20000000e+04],
[1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 4.80000000e+01,
7.90000000e+04],
[0.00000000e+00, 1.00000000e+00, 0.00000000e+00, 5.00000000e+01,
8.30000000e+04],
[1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 3.70000000e+01,
6.70000000e+04]])

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章