Machine Learning – 12 – Outliers, Removal ஐக் கண்டறிதல்

Outlier என்பது மற்ற தரவுகளிலிருந்து வேறுபட்டு சற்று தள்ளி இருக்கும் தரவு ஆகும். 5,10,15,20…75 எனும் மதிப்பினைக் கொண்டிருக்கும் தரவு வரிசைகளில் ஒன்றே ஒன்று மட்டும் 15676 எனும் எண்ணைக் கொண்டிருப்பின், அதுவே outlier ஆகும். இதைத் தான் நாம் கண்டறிந்து களைய வேண்டும்.

கீழ்க்கண்ட உதாரணத்தில், உள்ளீடாக உள்ள கோப்பிற்குள் இருக்கும் outliers ஒவ்வொரு column-லும் கண்டறியப்பட்டு  அவை ஒரு வரைபபடமாக வெளிப்படுத்தப்படுகின்றன. boxplot அல்லது violinplot இதற்குப் பயன்படுகின்றன.


import pandas as pd
import pylab
import numpy as np
from scipy import stats
from scipy.stats import kurtosis
from scipy.stats import skew
import matplotlib._pylab_helpers
df = pd.read_csv('./14_input_data.csv')
# Finding outlier in data
for i in range(len(df.columns)):
pylab.figure()
pylab.boxplot(df[df.columns[i]])
#pylab.violinplot(df[df.columns[i]])
pylab.title(df[df.columns[i]].name)
list1=[]
for i in matplotlib._pylab_helpers.Gcf.get_all_fig_managers():
list1.append(i.canvas.figure)
print (list1)
for i, j in enumerate(list1):
j.savefig(df[df.columns[i]].name)
# Removing outliers
z = np.abs(stats.zscore(df))
print(z)
print(np.where(z > 3))
print(z[53][9])
df1 = df[(z < 3).all(axis=1)]
print (df.shape)
print (df1.shape)

view raw

outliers.py

hosted with ❤ by GitHub

list1 என்பதற்குள் ஒவ்வொரு column-க்குமான வரைபடங்கள் சேமிக்கப்பட்டுகின்றன.

print(list1)

[<Figure size 640×480 with 1 Axes>, <Figure size 640×480 with 1 Axes>, <Figure s
ize 640×480 with 1 Axes>, <Figure size 640×480 with 1 Axes>, <Figure size 640×48
0 with 1 Axes>, <Figure size 640×480 with 1 Axes>, <Figure size 640×480 with 1 A
xes>, <Figure size 640×480 with 1 Axes>, <Figure size 640×480 with 1 Axes>, <Fig
ure size 640×480 with 1 Axes>]

பின்னர் savefig() மூலம் ஒவ்வொரு column-க்குமான வரைபடமும் அதன் பெயரிலேயே சேமிக்கப்படுகிறது. கீழ்க்கண்ட படங்களில் இடது பக்கம் இருப்பது ‘salePrice’ -க்கான violin plot ஆகும். வலது பக்கம் இருப்பது அதே column-க்கான box plot ஆகும். இவற்றில் ஏதாவது ஒன்றைப் பயன்படுத்தி outlier இருக்கும் இடத்தை நாம் தெரிந்து கொள்ளலாம்.  இங்கு SalePrice-ல் 300000-க்கு மேலும் 100000-க்கு கீழும் outlier இருப்பதாக வெளிப்படுத்தியுள்ளது.

அடுத்தபடியாக இத்தகைய outliers-ஐ எவ்வாறு நீக்குவது என்று பார்க்கலாம். Z Score, IQR Score போன்றவை இதற்காகப் பயன்படுகின்றன. Z Score என்பது ஒரு தரவு அதற்கான mean மதிப்பிலிருந்து எவ்வளவு தூரம் தள்ளி இருக்கிறது என்பதைக் கணக்கிட்டுக் கூறும். அதிக அளவு தள்ளி இருப்பவற்றை நாம் outlier-ஆக எடுத்துக் கொள்ளலாம்.

0 என்பதனை mean-ஆக வைத்துக்கொண்டு, அதிலிருந்து ஒவ்வொரு தரவும் எந்த அளவுக்கு தள்ளி உள்ளது என்பது பின்வருமாறு.

print(z)

[[0.65147924 0.45930254 0.79343379 … 0.31172464 0.35100032 0.4732471 ]
[0.07183611 0.46646492 0.25714043 … 0.31172464 0.06073101 0.01235858]
[0.65147924 0.31336875 0.62782603 … 0.31172464 0.63172623 0.74302803]

[0.65147924 0.21564122 0.06565646 … 1.02685765 1.03391416 0.23194227]
[0.79515147 0.04690528 0.21898188 … 1.02685765 1.09005935 0.23192429]
[0.79515147 0.45278362 0.2416147 … 1.02685765 0.9216238 0.2319063 ]]

வெறும் மேற்கண்ட மதிப்பினை மட்டும் வைத்துக்கொண்டு, outliers-ஐ சொல்லி விட முடியாது. அதற்கு ஒரு threshold-ஐ அமைக்க வேண்டும். பொதுவாக 3 என்பது threshold-ஆக அமையும். அதாவது 3-க்கும் மேல் தள்ளி இருப்பவை எல்லாம் outliers ஆகும். எனவே இந்த outliers-ஐ மட்டும் print செய்வதற்கான கட்டளை பின்வருமாறு.

print(np.where(z > 3))

(array([ 53, 58, 112, 118, 151, 161, 166, 178, 178, 185, 185,
185, 197, 224, 224, 224, 231, 278, 304, 309, 309, 313,
321, 332, 336, 349, 375, 378, 389, 440, 440, 440, 473,
477, 481, 496, 496, 496, 496, 515, 523, 523, 523, 527,
529, 533, 581, 585, 591, 605, 608, 635, 635, 642, 664,
691, 691, 691, 769, 769, 798, 803, 825, 897, 898, 910,
1024, 1031, 1044, 1044, 1061, 1169, 1173, 1182, 1182, 1182, 1190,
1230, 1268, 1298, 1298, 1298, 1298, 1298, 1298, 1350, 1353, 1373,
1373, 1386], dtype=int64), array([9, 9, 9, 3, 9, 9, 6, 8, 9, 3, 5, 9, 3,
1, 2, 9, 9, 9, 3, 6, 9, 9,
9, 1, 9, 9, 0, 9, 9, 1, 2, 9, 9, 9, 9, 1, 2, 3, 9, 9, 1, 2, 3, 9,
2, 0, 8, 9, 9, 6, 3, 3, 5, 6, 8, 1, 2, 3, 3, 5, 3, 5, 8, 5, 2, 5,
2, 5, 1, 2, 8, 3, 5, 1, 2, 3, 8, 5, 3, 1, 2, 3, 5, 6, 8, 5, 3, 1,
2, 5], dtype=int64))

மேற்கண்ட வெளியீட்டில் இரண்டு arrays() உள்ளத்தைக் கவனிக்கவும். இதன் முதல் array()-ல் outlier அமைந்துள்ள இடத்தின் row மதிப்பும், இரண்டாவது array()-ல் அதன் column-மதிப்பும் காணப்படும். எனவே  print(z[53][9]) எனக் கொடுக்கும்போது 53-வது row, 9-வது column-ல் உள்ள z core மதிப்பு 3.647669390284779 என வெளிப்படுவதைக் காணலாம்.

கடைசியாக 3-க்குக் கீழ் உள்ள மதிப்புகள் மட்டும் ஒரு புதிய dataframe-ல் சேமிக்கப்பட்டு அவையே outliers நீக்கப்பட்ட தரவுகளாக சேமிக்கப்படுகின்றன.

df1 = df[(z < 3).all(axis=1)]

எனவே பழைய dataframe-ல் 1460 rows இருப்பதையும், புதிய dataframe-ல் 1396 rows இருப்பதையும் காணலாம்.

(1460, 10)
(1396, 10)

 

 

%d bloggers like this: